javascript函数表达式有存在的必要吗?

发布于 2022-08-29 18:07:02 字数 334 浏览 30 评论 0

小白,正在学习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;
  })();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱殇璃 2022-09-05 18:07:02

你这问题槽点很多,我都不知道从哪开始...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_BUGGYfalse,是因为你使用的现代浏览器
而在IE6/7/8(万恶的IE)里IS_DONTENUM_BUGGYtrue

这里涉及到一个概念DontEnum(ES5里称之为Enumerable),即属性不能被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进行标识。
所以函数表达式大部分时候,至少在你这里,还是很有用的。

最后,prototype.js已经是太古时期使用的框架啦,LZ你最好还是换个例子研究吧

我为君王 2022-09-05 18:07:02

使用函数表达式的好处是

  1. 避免新增或覆盖全局变量
  2. 动态求值

例子:http://jsbin.com/sirup/3/edit?js,output

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文