在Javascript中,如何从该函数中调用但在其他地方定义的函数引用函数范围的变量?

时间:2015-11-28 12:07:57

标签: javascript scope

我有一个像这样的Javascript函数,在我无法改变它的地方定义:

foo.customSave = [];

foo.save = function() {
    var saveString = 'initial value';
    // stuff about saveString here
    for (i in foo.customSave) { foo.customSave[i](); }
    // more stuff about saveString here, including actually saving it
};

然后我有自己的代码:

bar.init = function() {
    // other init stuff here
    foo.customSave.push(function() {
        saveString += 'something meaningful here';
    });
    // more other init stuff here
};

bar.init()在适当的时间被调用(也就是说,在调用foo.save()之前)。问题似乎是当我尝试向saveString添加'something meaningful here'时未定义console.log(在此处发出customSave调用确认了这一点。)

我的DECLARE @dynsql nvarchar(max) SET @dynsql = 'select @InvoiceNo=InvoiceNo from '+ QUOTENAME(@DynDB) +'.[dbo].[TableName] where UserID = '+ cast(@UserID as nvarchar) EXEC sp_executesql @dynsql 函数是否可以访问该字符串,或者我被卡住了?

2 个答案:

答案 0 :(得分:1)

鉴于您无法修改与foo.save关联的功能,您无法修改saveString变量。这样做的原因是因为saveString是一个局部变量,其范围限定为与foo.save相关联的函数。因此,您可以调用该函数,但它基本上充当黑盒子,您无法访问其中定义的变量(事实上,如果不查看源代码,您甚至不会知道{{ 1}}变量存在)。

在与saveString关联的函数中,每次调用bar.init并将其推送到数组时,都会创建一个新的函数对象。并且因为您没有使用bar.init来声明var变量,JavaScript将尝试在推送到数组的函数中找到saveString变量。由于它无法在那里找到声明,JavaScript将继续查找与saveString关联的函数的下一个外部作用域中的变量。由于它无法在那里找到它,JavaScript将最终尝试在全局范围内找到它(并且也不会在那里取得成功)。

希望有所帮助,但长话短说,无法修改bar.init,你就被卡住了。

答案 1 :(得分:0)

如何将saveString添加为foo的属性?

像这样:

foo.customSave = [];

foo.saveString = '';

foo.save = function() {
    foo.saveString = 'initial value';
    // stuff about saveString here
    for (i in foo.customSave) { foo.customSave[i](); }
    // more stuff about saveString here, including actually saving it
};

然后:

bar.init = function() {
    // other init stuff here
    foo.customSave.push(function() {
        foo.saveString += 'something meaningful here';
    });
    // more other init stuff here
};