词法范围是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:未定义名称
有人能解释这个问题并提供解决方案吗?
非常感谢您的时间!!
答案 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;