Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
пример высосан из пальца, кому может понадобится сохранять контекст лямбды?
второй — контекст объекта.
var MyClass = function () {
var privateProp1 = 1;
var privateProp2 = 2;
var privateMethod = function () {};
this.publicMethod = function () {};
};
Bridge.AI = new Class({
Extends : Bridge.AIUtils,
var Analizer = function(_name) {
var analizer = this, // analizer а не self!
_router = new DataRouter(_name),
A function stored in a property of an object is called a method.
var $this = $(this);
! И как сам не догадался :)
var cl = {
test: function() {
var a = 1;
var b = 2;
var self = this;
setTimeout(function() {
self.callMethod(a);
}
setTimeout(function() {
self.callMethod(b);
}
}
}
self.callMethod(a).delay() ну или method(a).bind(this).delay();
Немножко расширим прототип Function
For MooTools Core 1.3 we are going to adopt the ES5 version of Function.prototype.bind.
при использовании bind, хранится ссылка на вызываемую функцию, при использовании var self = this; — ссылка на сам объект, контекст для которого нам нужен.
$('input').bind('keydown', function () {
var $this = $(this);
$this.css({
background : $this.val()
});
});
function example(){
return this.value + privateValue;
}
function exampleClass(value){
var provateValue = value;
// делаем метод со статичным контестом
var self = this;
this.methodWithFixedContext = function(){
return self.value + privateValue;
}
// либо же
this.methodWithFixedContext = (function(){
return this.value + privateValue;
}).bind(this);
// но никак не
this.methodWithFixedContext = example.bind(this);
}
var globalCounter = 0;
function setMethodTimeout(someObject){
globalCounter++;
// замыкание
setTimeout(function(){
someObject.method(globalCounter);
}, 10)
// почти то же самое, но через bind
setTimeout(someObject.method.bind(someObject, globalCounter), 10);
}
var objectA = { method: function(){ console.log(arguments) } };
var objectB = { method: function(){ console.log(arguments) } };
setMethodTimeout(objectA);
setMethodTimeout(objectB);
// замыкание
objectA.method(2);
objectB.method(2);
// bind
objectA.method(1);
objectB.method(2);
. В случае с bind создается обертка для функции, то есть это отдельная специальная структура, которая содержит ссылку на функцию, контекст и список значений для статичных параметров (если такие есть).
NOTE Function objects created using Function.prototype.bind do not have a prototype property or the [[Code]], [[FormalParameters]], and [[Scope]] internal properties.
new вызывает конструктор обьекта и клонирует… Не сам обьект, а его ПРОТОТИП!Ничего он не клонирует. Новосозданный объект связывается с прототипом. Это не то же самое, что клонирование.
Если вы не понимаете как работает фукнциональщина
Function.bind
— это фактически удобный способ делать частичное применение в Javascript. $('.some').click(function(){
// нам здесь нужен бы контекст, но хочется взять того, на ком горит событие...
this..... // <-- в таком случае как лучше поступать, как считаете?
}.bind(ctx));
Function.prototype.bind = function() {
if (arguments.length < 1 && typeof arguments[0] != "undefined") return this;
var __method = this, args = [];
for(var i=0;i<arguments.length;i++){ args.push(arguments[i]);}
var object = args.shift();
return function() {
var args_to_apply = []
for(var i=0;i<args.length;i++){ args_to_apply.push(args[i]);}
for(var i=0;i<arguments.length;i++){ args_to_apply.push(arguments[i]);}
return __method.apply(object, args_to_apply);
}
};
var obj = {
name: 'A nice demo',
fx: function() {
var s='';
for(var i=0;i<arguments.length;i++){s = s+(i==0?'':',')+arguments[i];}
alert(s);
}
};
var fx2 = obj.fx.bind(obj, 1, 2, 3);
fx2(4,5);
Правильный захват контекста в Javascript