从js小问题看大世界。

 

1. 这个姑且叫做分组判断执行(具体我也不知道怎么叫准确)。

  

  1. (a || b || c || d || function(){})()  


第一次见到这样的代码,确实有点头疼,不过很好,得一些朋友的解答。

 

该代码的具体含义为:第一个()里面会有判断,如果a为 true 的话,那么此句代码直接就执行为a(),如果a为false,那么就判断b是否为true,如果b为true,则执行为b().

如果前面的都不为true,那就是执行最后的默认方法。

 

2. js的分号自动组合

不知道何时看到过这样的代码.

 

  1. ;(function($){  
  2.     //do somethings  
  3. })(jQuery);  


在很才一段时间,我不知道为什么在代码的第一行要加一个分号,当然在大多数时候,不加这个分号也不存在问题。自己也就没有去深究过.

 

近日一些朋友讨论如下代码,才有机会了解这个分号的作用:

 

 
  1. //code 1  
  2. var a  = function(){}  
  3. a  
  4. (function(){return 1;})();  
  5.   
  6. //code 2  
  7. var a = function(){}  
  8. a  
  9. (function(){return 1 }())  


第一段代码执行会提示a not defined

 

第二段刚没有问题。

那么这是为什么呢。其实问题就出在a的后面没有分号

没有用分号结束符,那么js默认就认为a的下面的语句是同一个语句。第一段代码就会出错。

那么第二段为什么没有错呢。这是由于分组运算符的原因,将函数包含在分组符的内部,所以这样a 和函数就被分开了。

为了避免上述第一段代码的错误,我们自己写了一段内库,但是不知道,前面的代码有没有用分号

所以会在我们自己的代码的最前面加一个分号,这只是一种确保安全的做法。

 

3. 声明函数与函数表达式的区别

 

 
  1. //code1   
  2. foo();  
  3. function foo(){return 1;}  
  4.   
  5. //code2  
  6. var bar  = function foo(){  
  7.     foo();  
  8. }  
  9. foo();  


执行上述两段打代码, 很快就会有结果。第一段代码没有问题。而第二段则是foo not defined.

 

究其原因,第一段中的函数是函数声明。

js中,js会将函数声明提升,也就是说函数声明会在任何表达式被解析和求值之前被解析和求值。即使你的声明在代码最后一行

它同样会在同作用域内第一个表达式之前被解析和求值。

 

第二段代码之所以会报错也是作用域的问题。函数表达式所确定的作用域中,foo标签会保存到函数的变量对象中。

而变量对象中的属性是不能用window直接访问的。

只有活动对象才能够直接用window来访问。而活动对象是由全局对象来创建的。

也就是说只有当function 为全局对象的时候,才能用标签来访问。

当采用赋值语句的时间,我们创建的全局对象是bar而不是foo。所以可以用foo来访问对象,但是却不能用foo来访问。

 

转自:http://blog.csdn.net/yangzhihello/article/details/20281101

posted @ 2014-03-03 00:11  懦酷  阅读(158)  评论(0编辑  收藏  举报