jsfunction test() { console.log(this.num); } function doTest() { test(); } var obj = { num: 1, doTest: doTest, }; var num = 2; obj.doTest();
// 严格模式
undefined
// 非严格模式
2
jsvar num = 10 var obj1 = { num: 20, print: () => { console.log(this.num) } } obj1.print() var obj2 = { num: 30 } obj1.print.apply(obj2)
10
10
jsfunction test() { console.log(this); } test.call(null);
window
jsvar obj = { user: 'yupi', print: function(){ console.log(this.user); } } obj.print() new obj.print()
yupi
undefined
jsvar obj = { print: function() { var test = () => { console.log("yupi", this); } test(); }, rap: { doRap:() => { console.log(this); } } } var copyPrint = obj.print; copyPrint(); obj.print(); obj.rap.doRap();
yupi Window对象
yupi Obj对象
Window对象
严格模式
yupi undefined
yupi Obj对象
undefined
jsvar obj = { name: "yupi", func: function() { var self = this; console.log(this.name); console.log(self.name); (function() { console.log(this.name); console.log(self.name); }()); } }; obj.func();
yupi
yupi
undefined
yupi
jswindow.num = 2; var obj = { num: 4, test: (function(){ console.log(this); this.num *= 6; return function(){ console.log(this); this.num *= 8; } })() } var test = obj.test; test(); obj.test(); console.log(obj.num); console.log(window.num);
Window 对象
Window 对象
{num: 4, test: ƒ} // obj 对象
32
96
jsvar length = 10; function func() { console.log(this.length); } var obj = { length: 5, test: function(func) { func(); arguments[0](); } }; obj.test(func, 1);
10
2
jsvar num = 2; function print() { console.log(this.num); } var obj = { num: 4, test1: print, test2: function () { print(); }, }; obj.test1(); obj.test2(); var foo = obj.test1; foo();
4
2
2
jsvar a = 1; var b = 2; var obj = { a: 3, b: 4, getA: function () { var a = 5; return (function () { return this.a; })(); }, getB: function () { var b = 6; return this.b; }, }; console.log(obj.getA()); console.log(obj.getB());
1
4
jsvar num = 1; var obj = { num: 2, func: function(){ var num = 3; console.log(this.num); } } obj.func(); obj.func.call(); (obj.func)();
2
1
2
jsfunction test(num){ this.value = num; return this; } var value = test(5); var obj = test(6); console.log(value.value); console.log(obj.value);
undefined
6
shuoming
jsfunction test(value) { this.num = value; } var obj1 = { test: test, }; obj1.test(1); console.log(obj1.num); var obj2 = {}; obj1.test.call(obj2, 2); console.log(obj2.num); var foo = new obj1.test(3); console.log(obj1.num); console.log(foo.num);
1
2
1
3
jsfunction test(value){ this.num = value; } var obj1 = {}; var testBind = test.bind(obj1); testBind(1); console.log(obj1.num); var foo = new testBind(2); console.log(obj1.num); console.log(foo.num);
1
1
2
注意:new操作符会覆盖bind的this绑定,new操作符会创建一个新的对象,函数内的this会指向这个新创建的对象,而不是bind时绑定的对象
js(function(){ var a = b = 1; })(); var c; console.log(b); console.log(c); console.log(a);
1
undefined
ReferenceError: a is not defined
jsvar foo, bar; (function () { console.log(foo); console.log(bar); var foo = (bar = 1); console.log(foo); console.log(bar); })() console.log(foo); console.log(bar);
undefined
undefined
1
1
undefined
1
jsvar name = 'mianshiya'; (function() { if (typeof name === 'undefined') { var name = 'yupi'; console.log('cool ' + name); } else { console.log('swag ' + name); } })();
cool yupi
jsfunction foo(){ console.log('foo'); } var bar; foo(); bar(); bar = function() { console.log('bar'); }
foo
TypeError: bar is not a function
jsfunction foo() { var num = 1; function bar() { console.log(num); } bar(); } foo(); function func1() { var value = 1; func2(); } function func2() { console.log(value); } func1();
1
ReferenceError: value is not defined
jsvar num = 1; function func() { console.log(num); } (function () { var num = 2; func(); })();
1
jsfunction chain(a, b) { console.log(b); return { chain: function (c) { return chain(c, a); }, }; } var a = chain(0); a.chain(1); a.chain(2); a.chain(3); var b = chain(0).chain(1).chain(2).chain(3); var c = chain(0).chain(1); c.chain(2); c.chain(3);
undefined
0
0
0
undefined
0
1
2
undefined
0
1
1