31
function test() {
console.log(this.num);
}
function doTest() {
test();
}
var obj = {
num: 1,
doTest: doTest,
};
var num = 2;
obj.doTest();
// 严格模式
undefined
// 非严格模式
2
32
var num = 10
var obj1 = {
num: 20,
print: () => {
console.log(this.num)
}
}
obj1.print()
var obj2 = { num: 30 }
obj1.print.apply(obj2)
33
function test() {
console.log(this);
}
test.call(null);
34
var obj = {
user: 'yupi',
print: function(){
console.log(this.user);
}
}
obj.print()
new obj.print()
35
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
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();
37
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
var length = 10;
function func() {
console.log(this.length);
}
var obj = {
length: 5,
test: function(func) {
func();
arguments[0]();
}
};
obj.test(func, 1);
39
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();
40
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());
41
var num = 1;
var obj = {
num: 2,
func: function(){
var num = 3;
console.log(this.num);
}
}
obj.func();
obj.func.call();
(obj.func)();
42
function test(num){
this.value = num;
return this;
}
var value = test(5);
var obj = test(6);
console.log(value.value);
console.log(obj.value);
43
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);
44
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
(function(){
var a = b = 1;
})();
var c;
console.log(b);
console.log(c);
console.log(a);
1
undefined
ReferenceError: a is not defined
46
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
var name = 'mianshiya';
(function() {
if (typeof name === 'undefined') {
var name = 'yupi';
console.log('cool ' + name);
} else {
console.log('swag ' + name);
}
})();
48
function foo(){
console.log('foo');
}
var bar;
foo();
bar();
bar = function() {
console.log('bar');
}
foo
TypeError: bar is not a function
49
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
var num = 1;
function func() {
console.log(num);
}
(function () {
var num = 2;
func();
})();
51
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