2010-09-02 2 views
3

Рассмотрим следующий пример:сохраняющих объем работы функции при использовании Function.apply (...)

var funcToCall = function() {...}.bind(importantScope); 

// some time later 
var argsToUse = [...]; 
funcToCall.apply(someScope, argsToUse); 

Я хочу сохранить 'importantScope' из funcToCall. Тем не менее, мне нужно использовать apply для применения неизвестного количества аргументов. «apply» требует, чтобы я предоставлял «someScope». Я не хочу изменять область действия, я просто хочу применить аргументы к функции и сохранить ее область действия. Как мне это сделать?

+0

Да это: он стандартизован в ECMAScript 5. –

+0

Я m с использованием рамок Prototype. –

+0

Хорошо, вот что я подумал (извините за удаленный комментарий). Я полагал, что OP не говорил о [JavaScript 1.8.5] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function) - в настоящее время не поддерживается ни одним из основных браузеров. –

ответ

7

Вы можете передать любой старый объект (в том числе null) в качестве первого аргумента apply() вызова и this еще будет importantScope.

function f() { 
    alert(this.foo); 
} 

var g = f.bind({ foo: "bar"}); 

g(); // Alerts "bar" 
g.apply(null, []); // Alerts "bar" 

bind метод создает новую функцию, в которой значение this гарантированно будет объект, который передается в качестве параметра в bind вызова. Независимо от того, как будет вызвана эта новая функция, this всегда будет одинаковой. Простая реализация будет выглядеть следующим образом (обратите внимание на реализацию указанного ECMAScript 5 и что в Prototype делает больше, чем это, но это должно дать вам идею):

Function.prototype.bind = function(thisValue) { 
    var f = this; 
    return function() { 
     return f.apply(thisValue, arguments); 
    }; 
}; 
+0

@ Ник: так, просто пропустите 'null'. –

+0

Что вы подразумеваете под «любым старым объектом», если я передаю объект для применения, этот объект станет областью. Не так ли? К моменту совершения вызова у меня больше нет доступа к «importantScope» –

+0

@Bears Передача null связывает глобальный объект как область действия. Я хочу «сохранить» масштаб, что бы это ни было. –

Смежные вопросы