javascript - 哎呀。从方法内部调用方法

标签 javascript

如何从类中的函数调用类方法?我的代码是:

var myExtension = {

    init: function() {
        // Call onPageLoad
    },  

    onPageLoad: function() {  
        // Do something    
    },

}  

我试过...

onPageLoad();

... 在 init 方法中,但它说它未定义。

我在 google 上运气不太好,因为我不明白所使用的语法。我在网上找到的所有 JS OOP 示例都是不同的格式。我正在使用 Mozilla 用于扩展开发的格式。

最佳答案

调用当前方法的对象可通过特殊变量this 获得。任何时候您在对象上调用方法时,this 都会在方法内引用该对象。

var myExtension = {

    init: function() {
        this.onPageLoad();
    },  

    onPageLoad: function() {  
        // Do something    
    },

};

this 始终引用调用对象,而不是定义函数的对象或作为其属性的对象。

value = 'global';
var ob0 = {
        value: 'foo',
        val: function() {
            return this.value;
        },
    },
    ob1 = {value: 'bar'},
    ob2 = {value: 'baz'};

ob0.val(); // 'foo'
ob1.val = ob0.foo;
ob1.val(); // 'bar'
ob0.val.call(ob2); // 'baz'

var val = ob0.val;
val(); // 'global'

在最后一种情况下,val 作为自由函数执行(未绑定(bind)到对象的函数,即不是方法),在这种情况下 thisval 的执行过程中获取全局对象(在网络浏览器中为 window)的值。全局变量实际上是全局对象的属性,因此 val() 返回 'global'(名为 value 的全局变量的值)。由于全局变量实际上是全局对象的属性,因此您可以将自由函数视为实际上是全局对象的方法。从这个 Angular 来看,最后两行(在全局范围内执行时)等同于:

window.val = ob0.val;
window.val();

这种观点并不完全符合作用域的实际情况,尽管您只会注意到函数内部的差异。在函数中,window.val = ... 将创建一个全局变量,而 var val 则不会。

value = 'global';
var ob0 = {
        value: 'foo',
        val: function() {
            return this.value;
        },
    };

function lcl() {
    var val = ob0.val; // doesn't set a global named `val`
    return val(); // 'global'
}
lcl(); // 'global'
val(); // error; nothing named 'val'

function glbl() {
    window.val = ob0.val; // sets a global named `val`
    return window.val();  // 'global'
}
glbl(); // 'global'
val(); // 'global'

有关 call 的更多信息,请参阅 MDN 的引用页面上面用的方法。有关 this 变量的更多信息,请参阅“JavaScript “this” keyword”和“How does “this” keyword work within a JavaScript object literal?

关于javascript - 哎呀。从方法内部调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130293/

相关文章:

javascript - Web服务和网站在同一个项目中

javascript - 语法错误: missing ; after for-loop initializer

javascript - HTML 中定义的 SVG 标签与 D3 添加的标签

javascript - 使用 javascript 单击刚刚打开的页面上的链接

php - javascript改变显示样式

javascript - 在初始化之前设置延迟或超时

javascript - 您能否以编程方式将标签链接到不带字符串 id 的表单输入?

javascript - jquery 数据表,如何将下拉列表插入表格单元格

javascript - 从 JSON 响应输出下一个可用日期

javascript - 使用新 API 刷新多个数据表