【问题标题】:Javascript syntax with () - function scope [duplicate]带有()的Javascript语法-函数范围[重复]
【发布时间】:2011-03-01 18:40:20
【问题描述】:

可能重复:
JavaScript scope and closure

我对下面的 Javascript 语法不是很熟悉。任何人都可以为这个街区的感觉遮遮掩掩吗?目的是什么?

(函数 foo() { 警报(“酒吧”); })();

提前致谢。

【问题讨论】:

标签: javascript


【解决方案1】:

var tokenizer = (function(){ 变量 ID = 0; 返回函数(){ 返回 id++; }; })();

tokenizer(); // 0
tokenizer(); // 1
tokenizer(); // 2
alert(id); // undefined

【讨论】:

    【解决方案2】:

    这对我来说似乎是一种不好的做法(命名闭包函数),因为它会导致浏览器不一致。

    以下面的代码为例

    (function foo() {
        alert('bar');
    })();
    foo();
    

    在 Internet Explorer 中,您将收到 2 个警报,因为它实际上将函数创建为名为 foo 的全局函数。

    在 Chrome 中,它只会提醒一次,并且 foo 没有全局声明,所以你会收到一个 javascript 错误 foo is not defined

    通常你不会给闭包函数命名

    (function() { // notice you don't see foo anymore
        alert('bar');
    })();
    

    【讨论】:

    • 我不知道命名闭包函数的问题。并不是说我曾经这样做过,但很高兴知道。
    【解决方案3】:

    目的是使您的工作范围超出全球范围。这有助于封装您的对象并防止它们污染全局池。除了在函数 foo() 中声明的函数之外,您对包含函数 foo() 全局声明的任何变量都将不可用

    var GLOBALVAR //this is available to the global document scope
    (function foo() {
        var FOOVAR //only available within this function
        function bar(){
            FOOVAR = GLOBALVAR //this will work
        }
        alert('bar');
    })();
    FOOVAR = GLOBALVAR //This will not because FOOVAR is out of scope
    

    【讨论】:

      【解决方案4】:

      Javascript 允许您动态声明函数——它们被称为闭包——并且在你的示例中在第一组括号之间完成。当您引入第二组括号时,您正在调用您刚刚定义的那个函数。需要注意的区别是函数声明/定义和该函数的应用之间的区别。

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2015-12-20
        • 2019-05-01
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 2018-03-13
        相关资源
        最近更新 更多