整理一下在近日所学到一些比较杂的东西。
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来访问。