现在的位置: 首页 > 综合 > 正文

[ javasript ] 从js小问题看大世界。

2014年04月01日 ⁄ 综合 ⁄ 共 1148字 ⁄ 字号 评论关闭

整理一下在近日所学到一些比较杂的东西。

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

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

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

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

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

2. js的分号自动组合

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

;(function($){
    //do somethings
})(jQuery);

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

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

//code 1
var a  = function(){}
a
(function(){return 1;})();

//code 2
var a = function(){}
a
(function(){return 1 }())

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

第二段刚没有问题。

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

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

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

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

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

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

//code1 
foo();
function foo(){return 1;}

//code2
var bar  = function foo(){
    foo();
}
foo();

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

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

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

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

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

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

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

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

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

抱歉!评论已关闭.