我是javascript的新手,我遇到了一个无法解决的问题。
一开始我有以下代码,并且工作得很好
function foo(){
var load_b = new Array();
load_b = b();
}
function a() {
var files = document.getElementById("images").files;
return files;
}
function b(){
var get_a = a.call(get_a);
return get_a;
}
现在我正在尝试创建一个API,问题是当我执行var get_a = a.call(get_a);
或var get_a = a();
时,我会得到一个:
未捕获的ReferenceError:a未定义(...)。
我尝试了许多不同的方法来调用from b,但我总是遇到错误。目前我的代码看起来像这样。你们有什么想法吗?
function foo(){
var new_api = new my_api();
var load_b = new Array();
load_b = new_api.b();
}
var my_api = function(){
return {
a : function a() {
var files = document.getElementById("images").files;
return files;
},
b : function b() {
var get_a = a();
return get_a;
}
}
}
答案 0 :(得分:2)
您需要使用this
告诉脚本在当前范围内查找函数,而不是全局:
var get_a = this.a();
作为次要观点,这种语法有点多余:
a : function a() {
你不需要第二次提到“a”:
a : function() {
会奏效。
答案 1 :(得分:0)
如果您想继续使用现有代码,则必须将行var get_a = a();
更改为var get_a = this.a();
。
原因是你要指定你所引用的函数a
在父对象的范围内。在不使用this
的情况下,JavaScript默认查看当前函数范围,这意味着它正在尝试在a()
函数b
中找到b : function() { ... }
函数。
注意:我稍微清理了代码,并将document.getElementById("images").files
替换为测试数组['1', '2', '3']
,以便此代码在小提琴设置中运行。您可以稍后取消注释并更改该行。
function foo() {
var new_api = new my_api();
var load_b = new_api.b();
alert(load_b); // I added this here so this code outputs in a fiddle
}
var my_api = function() {
return {
a : function() {
var files = ['1', '2', '3']; //document.getElementById("images").files;
return files;
},
b : function() {
var get_a = this.a();
return get_a;
}
}
}
foo(); // I added this here so this code executes in a fiddle
答案 2 :(得分:0)
你的对象定义有点偏。以下是应该如何做的:
function foo() {
var new_api = new my_api();
var load_b = new_api.b();
console.log(load_b);
}
var my_api = function() {
this.a = function() {
return "the files"; // document.getElementById("images").files;
};
this.b = function() {
return this.a(); // use this.a to make sure we access local a
};
// return the object with a and b both set as functions:
return this;
}
foo();
答案 3 :(得分:-1)
试试这个:
var a = function() {
return document.getElementById("images").files;;
};
var b = function() {
return a() || [];
};
var foo = function() {
var load_b = b();
};