【问题标题】:Difference between function expression in global scope and function declaration全局范围内的函数表达式与函数声明的区别
【发布时间】:2015-01-24 11:55:42
【问题描述】:

我对我的 js 中的某些内容感到困惑。通常我会这样定义函数:

function f(){
    // do stuff
}

但我也可以这样定义函数:

f = function(){
    // do stuff
}

我一直认为它们之间没有区别,但我现在发现这是有效的:

f = function(){
    alert('IT WORKS!!');
}

function createCallback(request){
    request.done(function(data){
        var html = '';
        data['result'].forEach(function(bill){
            html += "<tr onclick=\"f();\"><td>" + bill.title + "</td></tr>";
        });
        $("#someId").html(html);
    });
}

但是当我将f 定义如下:

function f(){
    alert('IT WORKS!!');
}

然后我点击该行,它给出了ReferenceError: f is not defined

所以我想知道:function f(){}f = function(){} 之间实际上有什么区别?

【问题讨论】:

标签: javascript function syntax


【解决方案1】:

当你定义一个函数而不使用var 语句时,默认情况下该函数将被定义为全局范围内的一个属性。

引用MDN documentation on var

给未声明的变量赋值会在执行赋值时隐式地将其创建为全局变量(它成为全局对象的属性)。声明变量和未声明变量的区别是:

  1. 声明的变量在声明它们的执行上下文中受到约束。未声明的变量总是全局的。

  2. 在执行任何代码之前创建声明的变量。在执行分配给它们的代码之前,未声明的变量不存在。

  3. 声明的变量是其执行上下文(函数或全局)的不可配置属性。未声明的变量是可配置的(例如可以删除)。

由于这三个不同,未声明变量很可能会导致意想不到的结果。 因此建议始终声明变量,无论它们是在函数范围内还是在全局范围内。而在ECMAScript 5 strict mode 中,分配给未声明的变量会引发错误。

因此,当您使用function function_name(...){...} 语法定义时,它将在当前范围内。

由于第二个函数定义在全局作用域tr的onclick可以找到f。尝试像这样使用var 语句

var f = function(){
    alert('IT WORKS!!');
}

你会得到相同的ReferenceError: f is not defined

【讨论】:

    【解决方案2】:

    您忘记了var 声明。该函数在使用f = function(){ } 时全局定义。这就是为什么它可以从 onclick 处理程序访问而另一个不能访问的原因。

    请按照@Nehal 的建议阅读var functionName = function() {} vs function functionName() {}

    【讨论】:

    • 我不明白“忘记”是如何描述“选择不使用”的有效方式。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2015-04-12
    • 2016-05-17
    • 2017-01-20
    • 2022-11-30
    • 2010-11-04
    相关资源
    最近更新 更多