Mel*_*lon 2 javascript jquery javascript-events javascript-framework
我在testFun.js中有一个函数
var testFunc=function{
var hasCar=false;
return{
checkCar: function(){
for(var i=0; i<5; i++){
MyCar.check(hasCar); //defined in following MyCar.js
}
}
}
}();
Run Code Online (Sandbox Code Playgroud)
MyCar.js中的另一个功能
var MyCar=function(){
var createCar=function(){
//Create a car
//var car = new Car();
}
return{
check: function(hasCar){
console.log(hasCar); //PROBLEM HERE: fierBug console output is "false" always even CHECK_BUTTON has been clicked, why?
var handler=function(){
if(!hasCar)
createCar();
hasCar=true;
}
//CHECK_BUTTON is a button on UI
CHECK_BUTTON.click(handler);
}
}
}();
Run Code Online (Sandbox Code Playgroud)
正如您在MyCar模块模式中看到的,CHECK_BUTTON单击何时,我将调用createCar()function,并将hasCar值从false更改为true.
该hasCar定义在testFunc模块模式,并传递给MyCar.check(hascar).
我有内部Firebug的控制台输出MyCar.check()功能,我想到的是,当鼠标点击CHECK_BUTTON,控制台输出将是真实的,但我总是假的,为什么?我hasCar用来检查CHECK_BUTTON已被点击过一次与否,但如果它总是持有假值,我就不知道了.如何摆脱这个?
原始值按值传递,而不是通过引用传递.
因此true,hasCar在click事件处理程序(in MyCar.check)内部分配不会更改hasCar定义的值testFunc.
您可以使用对象:
var testFunc= (function(){
var hasCar = {val: false};
// ...
}());
var MyCar=(function(){
//...
return{
check: function(hasCar){
console.log(hasCar.val);
var handler=function(){
if(!hasCar.val)
createCar();
hasCar.val=true;
}
CHECK_BUTTON.click(handler);
}
}
}());
Run Code Online (Sandbox Code Playgroud)
或者hasCar在两个函数都可访问的范围中定义变量.
更新:
您仍将进入false控制台,因为hasCar.val仅true在您单击按钮后设置为单击该按钮console.log时从未调用.
在这里使用循环不会告诉你任何事情.根据您的设置,更适合测试:
var hasCar = {val: false};
MyCar.check(hasCar); // will output false
// now click the button
MyCar.check(hasCar); // will output true
Run Code Online (Sandbox Code Playgroud)
看看这个DEMO.
附加说明:
MyCar.ceck调用时都要添加一个新的单击处理程序.我不认为这是理想的.| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |