javascript - 如何以编程方式替换(包装)新方法中的方法?

标签 javascript methods scope variable-assignment

我有几个方法需要以基本相同的方式包装在新方法中。我的第一个解决方案不起作用,我明白为什么,但我不知道是否有一个简单的解决方案可以解决这个问题,或者是否不能按照我想要的方式完成。

这是一个例子。我的对象 a-c 具有 onClick 方法。我需要在 onClick 方法之前执行一些代码。我尝试了以下方法:

// objects a-c
a = {onClick : function () { console.log('a'); }};
b = {onClick : function () { console.log('b'); }};
c = {onClick : function () { console.log('c'); }};

// first try
var arr = [a, b, c]
for (var i = 0; i < arr.length; i++) {
    var oldOnClick = arr[i].onClick;
    arr[i].onClick = function () {
        // new code here
        oldOnClick();
    }  
}

// outputs 'c'
// what i want is to maintain a reference to the original method
// so in this case, execute my new code and output 'a'
a.onClick();

这不起作用,因为当调用新方法时,oldOnClick 将指向上次迭代中的方法,而不是分配时的 to 方法。

是否有一个我忽略的简单解决方案?

最佳答案

你需要的是关闭:

for(var i=0, l=arr.length; i<l; i++){
 (function(i){
   var oldOnclick = arr[i].onClick; 
   //etc.
 })(i);
}

关于javascript - 如何以编程方式替换(包装)新方法中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023460/

相关文章:

C# 使用分层参数重载解析

java - 每 x 分钟调用一个方法

javascript - ng-model 不与文本字段绑定(bind)

javascript - 将 forEach() 与 promise 一起使用,同时在 .then() 链中访问先前的 promise 结果?

javascript - JQuery UI removeClass() 动画不只触发 chrome

javascript - Backbone.js - Todo Collection - 这个返回语句中到底发生了什么?

javascript - 使用 Start Bootstrap "Agency"主题提交表单时出错

javascript - jQuery 代码在 ".aspx"页面中不起作用

java - 为什么这些 BST 方法都不起作用?

c++ - 其定义中的类变量?