a = function (){
var b = 10;
var k = function(){
console.log(b);
}();
}();
以上代码将打印10。
var k = function(){
console.log(b);
}
var a = function (){
var b = 10;
k();
}();
此代码将打印 undefined
。
是否可以打印10
?就像在调用范围之前将范围绑定到k
一样。
答案 0 :(得分:1)
当@Derek回答时,你显然可以传递一个论点。
除此之外,您无法转移或更改变量范围,但您可以直接操作调用上下文。
因此,您可以将b
设置为对象的属性,并将该对象设置为您正在调用的任何函数的调用上下文。
var k = function(){
console.log(this.b);
}
var a = function (){
var obj = {b:10};
k.call(obj);
}();
.call()
方法调用k
函数,但将您提供的第一个参数设置为被调用函数的调用上下文。
实际上,从技术上讲,您不需要使用对象。您可以直接将数字设置为要使用的值...
var k = function(){
console.log(this);
}
var a = function (){
var b = 10;
k.call(b);
}();
在严格模式下,您将获得该数字,但在非严格模式下,您将获得Number作为其对象包装器。
答案 1 :(得分:0)
真的?你有什么尝试?
var k = function(b){
console.log(b);
}
var a = function (){
var b = 10;
k(b); //Done.
}();
为什么在第二个示例中为您提供undefined
是因为b
未定义。在使用变量b
之前,您必须先定义它。
var k = function(b){ //<--There, defined. Mission accomplished.
答案 2 :(得分:0)
可以通过eval
授予对范围的访问权限。
var a = (function() {
var b = 10;
return {
eval: function(s) {
return eval(s);
}
};
})();
var k = function() {
console.log(a.eval("b"));
};
k();