js this 学习笔记
默认绑定
var foo=
function(){
console.log(
this.a);
}
var a=
2;
foo();
隐式绑定
var foo=
function(){
console.log(
this.a);
}
var object={
a:
2,
foo:foo
}
object.foo();
var foo=
function(){
console.log(
this.a);
}
var object_deep1={
a:
2,
foo:foo
}
var object_deep2={
a:
1,
object_deep1:object_deep1
}
object_deep2.object_deep1.foo();
显式绑定
var bind=
function (fn,object){
return function(){
return fn.apply(object,
arguments);
}
}
var foo=
function(){
console.log(
this.a);
}
var bar=bind(foo,{a:
2});
bar();
var foo=
function(a){
this.a=a;
}
var bar=
new foo(
2);
console.log(bar.a);
function foo(p1,p2,p3) {
this.val = p1 + p2+p3;
}
var bar = foo.bind(
null,
"1",
"2");
var baz =
new bar(
"4",
"5");
console.log(baz.val)
function foo(a,b) {
this.val=a+b;
}
var bar = foo.bind(
Object.create(
null ),
2 );
var baz=
new bar(
'3');
console.log(baz.val)
if (!
Function.prototype.softBind) {
Function.prototype.softBind =
function(obj) {
var fn =
this;
var curried = [].slice.call(
arguments,
1 );
var bound =
function() {
console.group(
"_");
console.log(
"obj:");
console.log(obj);
console.log(
"this:");
console.log(
this);
console.log((!
this ||
this === (window || global)) ?obj :
this)
console.groupEnd();
return fn.apply((!
this ||
this === (window || global)) ?
obj :
this,
curried.concat.apply( curried,
arguments )
);
};
bound.prototype =
Object.create( fn.prototype );
return bound;
};
}
var object={
a:
2
}
var bar={
a:
3,
foo:foo
}
var foo=
function(){
console.log(
this.a);
console.log(
arguments);
}
var baz=foo.softBind(object,
1);
bar.foo();
箭头绑定
function foo() {
return (a) => {
console.log(
this.a );
};
}
var obj1 = {
a:
2
};
var obj2 = {
a:
3
};
var bar = foo.call( obj1 );
bar.call( obj2 );
列外情况 (间接引用)
function foo() {
console.log(
this.a );
}
var a =
2;
var o = { a:
3, foo: foo };
var p = { a:
4 };
o.foo();
(p.foo = o.foo)();
function foo() {
console.log(
this.a );
}
var a =
2;
var o = { a:
3, foo: foo };
var p = { a:
4 };
o.foo();
var callfn=
function(fn){
fn();
}
callfn(o.foo);
转载请注明原文地址: https://ju.6miu.com/read-12331.html