1,如何在浏览器环境 中创建和访问的全局变量:
myglobal = "hello"; // 不推荐写法
console.log(myglobal); // "hello" console.log(window.myglobal); // "hello" console.log(window["myglobal"]); // "hello" console.log(this.myglobal); // "hello"
2,隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。
- 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
- 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的:
// 定义三个全局变量
var global_var = 1; global_novar = 2; // 反面教材 (function () { global_fromfunc = 3; // 反面教材 }()); // 试图删除 delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // 测试该删除 typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined"在ES5严格模式下,未声明的变量(如在前面的代码片段中的两个反面教材)工作时会抛出一个错误。
3,对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。
反例:myname = "global"; // 全局变量function func() { alert(myname); // "undefined" var myname = "local"; alert(myname); // "local"}func();
上面的代码片段执行的行为可能就像下面这样:
myname = "global"; // global variablefunction func() { var myname; // 等同于 -> var myname = undefined; alert(myname); // "undefined" myname = "local"; alert(myname); // "local"}func();
4,循环
// 次佳的循环for (var i = 0; i < myarray.length; i++) { // 使用myarray[i]做点什么}
修改成:
for (var i = 0, max = myarray.length; i < max; i++) { // 使用myarray[i]做点什么}
5,
// 不好的 setTimeout("myFunc()", 1000);setTimeout("myFunc(1, 2, 3)", 1000); // 更好的setTimeout(myFunc, 1000);setTimeout(function () { myFunc(1, 2, 3);}, 1000);