window.name = "the window object"
function rangeTest( ) {
return this.name;
}
// 전역 범위에서 함수 호출:
scopeTest()
// -> >var foo = {
name: "foo 객체!",
otherScopeTest: function() { return this.name }
}
foo.otherScopeTest();// -> "foo 객체!"
var foo_otherScopeTest
foo_otherScopeTest()
// –> "창 객체"
함수에 대한 객체 다른 변수에 값을 할당한 후에도 이 함수의 실행 컨텍스트는 여전히 이 객체이므로 바인딩 메서드를 사용해야 합니다.
bind 구현은 다음과 같습니다.
// Prototype.js의 .bind 메서드
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args. Shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)))
}; };
사용 예:
var obj = {
name: '좋은 데모',
fx: function() {
alert(this.name);
}
}; >window.name = '나는 정말 아름다운 창문이다!';
function runFx(f) {
f()
}
var fx2 = obj.fx.bind(obj);
runFx(obj.fx) ;
runFx(fx2);
참조:
http://www.prototypejs.org/api/function/bind
추신:
방금 프로토타입js를 발견했습니다. API 문서에 아주 자세하게 설명되어 있으니 시간을 내어 자세히 읽어보세요.
간단한 구현:
var _this = this;
return function() {
return _this.apply(obj,
Array.prototype.slice.call(arguments));
}
}
var name = 'window',
foo = {
name:'foo object',
show:function() {
return this.name ;
}
};
console.assert(foo.show()=='foo object',
'예상된 foo 개체, 실제는 ' foo.show()); var foo_show = foo.show;
console.assert(foo_show()=='window',
'예상되는 창, 실제는 ' foo_show())
var foo_show_bind = foo.show.bind ( foo);
console.assert(foo_show_bind()=='foo object',
'foo 객체가 예상되지만 실제는 ' foo_show_bind());