全局变量/预解析/For循环的优化/eval()/parseInt()和Number/左花括号的位置

全局变量,你的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"
   }
}
几点习惯
驼峰命名,构造函数首字母大写,全大写来设定全局变量或者常量,首字母用_来模拟私有变量

你可能感兴趣的:(JavaScript)