代码分析2-this和作用域

用户头像
新鲜噩梦
little笔记全栈作者
创建于:2025-06-05 16:05:25字数:4827
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
最后编辑于:2026-01-11 09:11:45
©著作权归作者所有,转载或内容合作请联系作者。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,little笔记系信息发布平台,仅提供信息存储服务。