我有一个像这样的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
函数是否可以访问该字符串,或者我被卡住了?
答案 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
};