全局变量,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量。包括:第三方JS库,广告代码...
减少全局变量的方法:最直接的使用var声明变量,分割命名空间,函数立即执行。
function f(){
var a = b = 1;
}
该方法会产生出一个意外的全局变量b。分析:
可以理解为操作是:var a = ( b = 1 ),首先是执行b = 1,这个表达式返回1,然后1赋给a.
隐式创建的全局变量是可以被delete操作的,而var声明的全局变量是不能被delete操作的
delete a;// =>返回值 false
delete b;//=>返回值true
如果在没有window属性的环境中,任何位置,可以用下面的方法来获取全局变量:
var global = (function () {
return this;
}());
预解析,在JS中可以在函数的任何位置来用var声明变量跟在顶部声明是一样的,这被称为预解析(hoisting)
a = "global";
function f(){
console.log(a);
var a = "local";
console.log(a);
}
f();
//=>"undefined"
//=>"local"
这个例子中,a的声明被提前到函数的顶部,但是赋值不会提前,var a = "local"分为两个操作,1.声明a; 2.把"local"赋值给a。预解析提前的只是声明!可以理解为:
a = "global";
function f(){
var a;
console.log(a);
a = "local";
console.log(a);
}
有个类似的容易混淆的例子:
function ff(x){
console.log(x);
var x = 2;
console.log(x);
}
ff(1);
//=>1
//=>2
函数的变量跟全局变量不同,该例子中相当于在顶部做了声明赋值操作:var x = 1;
For循环的优化,
for(var i = 0, max = arr.length;i < max; i += 1){
console.log(arr[i]);
}
1.缓存length,避免每次循环都要去取;2.用i += 1或者i = i +1来代替i++,这样貌似在JS中效率更高,小细节,不必太计较。
for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。
原因:如果数组被自定义的属性增强,那么遍历时可能会有不合逻辑的内容;遍历的顺序无法保证。但是可以用hasOwnProperty()方法过滤原型属性。
避免用eval(),一个例子就是在setTimeout中:
//use:
setTimeout(myFunc, 1000);
//not:
setTimeout("myFunc()", 1000);
可以用new Function来代替eval:
jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // => 2
另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己些。不管你在哪里执行 Function(),它只看到全局作用域。所以其能很好的避免本地变量污染。在下面这个例子中,eval()可以访问和修改它外部作用域中的变量,这是 Function做不来的(注意到使用Function和new Function是相同的)。
(function () {
var local = 1;
eval("local = 3; console.log(local)"); // logs "3"
console.log(local); // logs "3"
}());
(function () {
var local = 1;
Function("console.log(typeof local);")(); // logs undefined
}());
parseInt()和Number来转换数字:
parseInt:不是简单的转换,而且可能与进制有关,比较保险的做法是parseInt("02", 10),第二个参数是进制,而且parseInt()可以处理非纯数字,如parseInt(“10saf”)会返回10。
而Number("007")则更简单,效率也更高。
左花括号的位置,反面的例子相当于return undefined;:
function func() {
return
// 下面代码不执行
{
name : "Batman"
}
}
几点习惯: