欢迎来到吴小小的专栏!

js考察this,作用域链和闭包

在严格版中的默认的this不再是window,而是undefined。

先看两个例子

example one

      var num = 20;
      var obj = {
        num: 30,
        fn: (function() {
          this.num *= 3;
          num += 15;
          var num = 45;
          return function() {
            this.num *= 4;
            num += 20;
            console.log(num)
          }
        })(num)
      };
      var fn = obj.fn;
      fn(); //因此时num是在fn函数定义的是个局部变量,num会自动找在哪里定义的找到初始值再计算,即45+20=65
      obj.fn(); //因fn()执行的时候num改变成65了, 65+20=85

example two

      var num = 20;
      var obj = {
        num: 30,
        fn: (function() {
          this.num *= 3;
          console.log(this) //因这里是个自执行函数的
          num += 15;
          var num = 45;
          return function() {
            this.num *= 4;
            num += 20;
            // console.log(this.num)
          }
        })(num)
      };
      var fn = obj.fn;
      fn(); //因此时this指向window,在自执行函数执行的时候,this.num *= 3;此时window.num = 60,执行fn(),60*4 = 240
      obj.fn(); //120 此时this指向obj,this.num = 30,  30*4 = 120

知识点一:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

(function(){
    //浏览器中this指向window
}());

function a() {
    console.log(this)
}
a() //window

知识点二:当this碰到return时

如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),则new函数返回改引用类型的对象

function fn()  
{  
    this.name="吴小小"
    return {};  //或者 rerurn function(){} 或者 return []
}
var a = new fn;  
console.log(a.user); //undefined

function fn()  
{  
    this.name="吴小小"
    return undefined; //或者 rerurn null
}
var a = new fn;  
console.log(a); //fn {name: "吴小小"}

知识点三 apply call

apply或者call第一个参数是this作用域的指向,第二个以后指的是参数

(function(a){
  console.log(this,a)
}).apply(0,[4,3])
// Number 4

(function(a){
  console.log(this,a)
}).apply({},[4,3])
// {} 4

(function(a){
  console.log(this,a)
}).apply(null,[4,3])
// window 4

(function(a){
  console.log(this,a)
}).apply(undefined,[4,3])
// window 4
posted @ 2017-11-21 16:54  吴小小  Views(932)  Comments(0Edit  收藏  举报