Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试将内部方法作为目标时出现javascript作用域问题_Javascript_Anonymous Function - Fatal编程技术网

尝试将内部方法作为目标时出现javascript作用域问题

尝试将内部方法作为目标时出现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

我有一个js文件,代码如下:

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