我正在尝试理解javascript范围,我想知道是否在以下示例中:
// B can access 'context'
var a = function (context) {
b = function () {
console.log(context);
};
b();
};
a('nicccce'); // works!
// C can't access 'context'
var d = function () {
console.log(context);
};
var c = function (context) {
d();
};
c('oh oh'); // breaks
有没有办法从'd'功能访问'上下文'?
修改
我知道我可以将参数传递给d函数,这显然是理智要做的事情,但我想知道是否还有另一种方法,可能使用{{1} } this.callee
。
答案 0 :(得分:1)
你可以
1)将context
传递给d
,就像c
和a
一样。或
2)将context
置于d
的词法范围内。
选项2听起来很复杂,但事实并非如此。这正是你在b
的情况下所做的。 context
与b
的执行范围“封闭”,因为该变量在b
的调用者范围内可用(因为它是a
的参数)。
答案 1 :(得分:0)
不,这是不可能的,会导致非常难看/不可读的意大利面条代码。
为什么不能将它作为参数传递给函数?另一个(但也很难看)解决方案是在两个函数都可以访问它的范围内声明变量(即在父函数或全局函数中)
答案 2 :(得分:0)
在您的示例中,“context”是一个作用于函数c()和a()的变量(两个不同作用域中具有相同名称的两个不同变量)。
根据您如何命名变量“context”,我认为.call正是您要找的?
值得一提的是,一旦你忘记了块范围,javaScript中的范围实际上非常简单。 function { ... }
之间出现的任何内容都是范围。
答案 3 :(得分:0)
在您的情况下,如果您将上下文作为参数传递给c,它将不会中断:
// C can access 'context'
var d = function () {
console.log(arguments[0]);
};
var c = function (context) {
d(context);
};
c('oh oh'); // doesn't break
在d中你可以使用argv / args访问它(不记得确切) 所以类似于args [0]或argv [0]
编辑:
使用参数更改代码
答案 4 :(得分:0)
定义位于顶部范围内的变量:
(function(){
var global;
var d = function () {
console.log(global);
};
var a = function (local) {
global = local;
b = function () {
console.log(global);
};
b();
};
}())