代码分析2-this和作用域

31
js
function test() { console.log(this.num); } function doTest() { test(); } var obj = { num: 1, doTest: doTest, }; var num = 2; obj.doTest();

// 严格模式
undefined
// 非严格模式
2

32
js
var num = 10 var obj1 = { num: 20, print: () => { console.log(this.num) } } obj1.print() var obj2 = { num: 30 } obj1.print.apply(obj2)

10
10

33
js
function test() { console.log(this); } test.call(null);

window

34
js
var obj = { user: 'yupi', print: function(){ console.log(this.user); } } obj.print() new obj.print()

yupi
undefined

35
js
var 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

36
js
var 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

37
js
window.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

38
js
var length = 10; function func() { console.log(this.length); } var obj = { length: 5, test: function(func) { func(); arguments[0](); } }; obj.test(func, 1);

10
2

39
js
var 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

40
js
var 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

41
js
var 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

42
js
function 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

43
js
function 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

44
js
function 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时绑定的对象

45
js
(function(){ var a = b = 1; })(); var c; console.log(b); console.log(c); console.log(a);

1
undefined
ReferenceError: a is not defined

46
js
var 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

47
js
var name = 'mianshiya'; (function() { if (typeof name === 'undefined') { var name = 'yupi'; console.log('cool ' + name); } else { console.log('swag ' + name); } })();

cool yupi

48
js
function foo(){ console.log('foo'); } var bar; foo(); bar(); bar = function() { console.log('bar'); }

foo
TypeError: bar is not a function

49
js
function 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

50
js
var num = 1; function func() { console.log(num); } (function () { var num = 2; func(); })();

1

51
js
function 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