如何在Javascript中实现非匿名/声明函数中的词法作用域

时间:2017-07-12 09:07:53

标签: javascript

词法范围是Javascript中最令人困惑的主题之一,我遇到的情况是我无法理解错误,或者我应该说代码无效的原因。

以下是一个例子:

我在匿名函数中记录了name变量并且工作正常。

function print() {
    var name = 'foo bar';
    printer(function(){
        console.log(name)
    });
}

function printer(callback) {
    callback();
}

print();
  

结果:foo bar

但是因为我不想声明一个匿名函数。所以,我已经单独宣布了它。

function print() {
    var name = 'foo bar';
    printer(callbackHandler);
}

function callbackHandler() {
    console.log(name)
}

function printer(callback) {
    callback();
}

print();
  

结果:ReferenceError:未定义名称

有人能解释这个问题并提供解决方案吗?

非常感谢您的时间!!

2 个答案:

答案 0 :(得分:3)

当将命名或匿名函数作为需要来自当前范围的变量的参数传递时,您必须"转换"它到绑定函数。您可以通过Function.prototype.bind电话完成此操作。在你的情况下,像这样:

function print() {
    var name = 'foo bar';
    printer(callbackHandler.bind(null, name));
}

function callbackHandler(name) {
    console.log(name)
}

function printer(callback) {
    callback();
}

print();

答案 1 :(得分:1)

JavaScript有两种范围,本地和全局。如果变量在函数内,则它是该函数的本地变量。但是,该变量可以绑定到另一个函数,匿名或命名,并且可以用于该函数的使用,只要该函数在该局部范围内定义即可。



console.log(
  str.split('<br>').filter( e => e ).pop()
);
&#13;
&#13;
&#13;