84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
小白,正在学习js,顺带看一点儿prototype.js的源码,发现了很多函数表达式,这么做有必要吗?为什么不直接取函数表达式的运算结果呢?
比如下面这个,感觉怎么执行结果都是false,为啥不直接 var Class = true ?
var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { if (p === 'toString') return false; } return true; })();
认证0级讲师
你这问题槽点很多,我都不知道从哪开始...O__O"…首先,你这代码不完整啊,至少也是
var Class = (function() { var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { if (p === 'toString') return false; } return true; })(); /*do something*/ })()
后边正事都没干的,谁知道Class的值会是啥?当然,我们可以知道IS_DONTENUM_BUGGY是啥!你觉得IS_DONTENUM_BUGGY是false,是因为你使用的现代浏览器而在IE6/7/8(万恶的IE)里IS_DONTENUM_BUGGY是true
IS_DONTENUM_BUGGY
false
true
这里涉及到一个概念DontEnum(ES5里称之为Enumerable),即属性不能被for..in循环枚举比如说
for..in
var obj = { name:"XiaoMing", get:function() {return this.name} }; for(var prop in obj) { console.log(prop); //会输出name,get }
for..in不会枚举出toString,isPrototypeOf,valueOf之类的内置属性,它们是不可枚举的如果我们重写它们(就像你的函数一样),不同的浏览器(没错,我就是说的IE)结果就会有分歧,需要IS_DONTENUM_BUGGY进行标识。所以函数表达式大部分时候,至少在你这里,还是很有用的。
toString,isPrototypeOf,valueOf
最后,prototype.js已经是太古时期使用的框架啦,LZ你最好还是换个例子研究吧
使用函数表达式的好处是
例子:http://jsbin.com/sirup/3/edit?js,output
你这问题槽点很多,我都不知道从哪开始...O__O"…
首先,你这代码不完整啊,至少也是
后边正事都没干的,谁知道Class的值会是啥?
当然,我们可以知道
IS_DONTENUM_BUGGY
是啥!你觉得
IS_DONTENUM_BUGGY
是false
,是因为你使用的现代浏览器而在IE6/7/8(万恶的IE)里
IS_DONTENUM_BUGGY
是true
这里涉及到一个概念DontEnum(ES5里称之为Enumerable),即属性不能被
for..in
循环枚举比如说
for..in
不会枚举出toString,isPrototypeOf,valueOf
之类的内置属性,它们是不可枚举的如果我们重写它们(就像你的函数一样),不同的浏览器(没错,我就是说的IE)结果就会有分歧,需要
IS_DONTENUM_BUGGY
进行标识。所以函数表达式大部分时候,至少在你这里,还是很有用的。
最后,prototype.js已经是太古时期使用的框架啦,LZ你最好还是换个例子研究吧
使用函数表达式的好处是
例子:http://jsbin.com/sirup/3/edit?js,output