尝试将内部方法作为目标时出现javascript作用域问题
我有一个js文件,代码如下:尝试将内部方法作为目标时出现javascript作用域问题,javascript,anonymous-function,Javascript,Anonymous Function,我有一个js文件,代码如下: var myAnonFun = function (param1) { function createHTML(){ ..... sHTML += "<select id=param1 onchange='makeCalculations(this)' >"; } var vText = document.getElementById("results"); vText.innerHTML = sHTML; function makeCal
var myAnonFun = function (param1) {
function createHTML(){
.....
sHTML += "<select id=param1 onchange='makeCalculations(this)' >";
}
var vText = document.getElementById("results");
vText.innerHTML = sHTML;
function makeCalculations(){
}
}
var createAnonFun = myAnonFun (param1);
js文件中的代码将按预期工作。但是,每当在js文件内创建的select html对象中更改值时,我都会收到一个错误,指出没有makeCalculations函数
据我所知,问题是select对象试图从全局范围访问函数,当然那里没有函数
所以我的问题是:如何将select对象定位到myAnonFun var中的makeCalculations函数
提前谢谢你
makeCalculations
是在var myAnonFun=function(param1){
中声明的,因此它的作用域是该函数的局部作用域(不能全局访问)
最好使用事件侦听器,而不是声明内联事件处理程序:
因此,不是:
sHTML += "<select id=param1 onchange='makeCalculations(this)' >";
致:
致:
请注意,要使其工作,您必须在某个位置(函数外部)执行:
您可以使
makeCalculations
在全局范围内可用:
this.makeCalculations=function(){
// ....
}
//外部:
myAnonFun.makeCalculations();
而不是sHTML+=“”;
您可以使用以下命令
var selectElement = document.createElement("select");
selectElement.addEventListener("change", makeCalculations);
vText.appendChild(selectElement); //this or replace all contents of vText
此方法还删除了不必要的字符串连接混淆。
从外部函数返回{makeCalculations}
,然后可以执行createAnonFunc.makeCalculations()
从外部为什么不将其移动到外部?acdc junior,我认为使用内联事件处理程序与使用事件侦听器是一样的。它们之间有区别吗,或者区别在于第二个函数的设置方式?使用addEventListener()
与内联相比,内联更具有可读性和可维护性,请参见:那么,在第一个选项中,您所说的是将整个函数作为参数传递,对吗?如果我只传递函数调用,我会遇到相同的范围问题,还是没有?谢谢您“只传递函数调用”是什么意思这个document.getElementById('param1').addEventListener('change',MakeColutions);
?如果是这样的话,这就行了,区别在于MakeColutions
的第一个参数将是事件,而不是元素(这就是为什么我传递了一个函数来包装调用makeCalculations
,将元素作为第一个参数。当然,您仍然可以从事件
对象(在事件.target
中)获取元素。).acdcjunior,我不明白的是,如果我们仍然只是传递方法调用,addEventListener是如何工作的。该方法将如何找到?该方法仍然属于私有范围,对吗?
sHTML += "<select id=param1 onchange='makeCalculations(this)' >";
sHTML += "<select id=param1 onchange='createAnonFun.makeCalculations(this)' >";
function makeCalculations(){
...
}
}
function makeCalculations(){
...
}
return {makeCalculations};
}
var createAnonFun = myAnonFun (param1);
var selectElement = document.createElement("select");
selectElement.addEventListener("change", makeCalculations);
vText.appendChild(selectElement); //this or replace all contents of vText