• 谈谈 JavaScript 中的 this 指向问题


         JavaScript 中的 this 为一个重难点,它不像静态语言 C#、Java 一样,就表示当前对象。而在 JS 中, this 是运行时确定,而并非定义时就已确定其值。

         谈起 this ,必须少不了 JavaScript 另一个重点:函数,在 JS 中函数有以下几种定义方法。

     1   // 函数声明
     2     function fun(){
     3         
     4     }
     5     
     6    // 函数表达式
     7     var fun=function(){
     8         
     9     };
    10     
    11     // Function 构造函数 
    12     var fun=new Function (arg1, arg2, ... argN, functionBody)  arg1 arg2 .... 为函数形参  functionBody 为函数主体

     一   this 指向 window  

     1 function  f(){
     2 
     3   console.dir(this);
     4   console.dir(this.f===f);
     5   console.dir(this===window)
     6 
     7 }
     8 
     9 f();
    10 
    11 // 此时,可视 f 为 window 对象下定义的一个属性,f() 可视为由 window 进行调用,此时,this 即指向 window

     

        二   this 指向当前对象

       

     1 var obj={name:"jack",age:20,say:function()
     2 {
     3   console.dir(this);
     4  console.dir(this===obj);
     5  alert(this.name);
     6 
     7 }};
     8 
     9 obj.say();
    10 
    11 // 通过 obj 对象调用 say 方法,而此时 say 方法即指向当前对象

     三  this 指向通过构造器函数所创建的对象

       

     1 var Person=function(name,age)
     2 {
     3   this.Name=name;
     4   this.Age=age;
     5   console.dir(this);
     6   
     7 };
     8 
     9 new Person("jack",20);
    10 
    11 Person("jack",20);
    12 
    13 // 前者通过 new 关键词,调用 Person 函数,此时,this 指向当前构造器函数所创建的对象
    14 
    15 
    16 // 而后者,直接调用 Person 函数,参考第一条,可视为 window.Person(),此时,this 指向 window

     

     四   this 在原型中,指向通过该构造器函数创建的对象(同 new )

       

     1 var Person=function(name,age)
     2 {
     3    this.Name=name;
     4    this.Age=age;
     5 
     6 };
     7 
     8 Person.prototype.say=function()
     9 {
    10    console.dir(this);
    11   
    12 
    13 }
    14 
    15 new Person(“jack”,20).say();
    16 
    17 // 首选,以 Person 为构造器创建对象,再调用 say 方法,此时,this 指向以该构造器造建的函数对象

           最后,看看几个容易引起误解的地方 ,有关该函数中 this 指向,关于以下两个,本人仅仅通过 chrome 控制台及调试,原理性感觉用 Java、C# 的无法解释。

      

     1 var f={name:'jack',age:20,say:function()
     2 {
     3   console.dir(this);
     4   console.dir(this.name);
     5 
     6 }};
     7 
     8 var f1=f.say;
     9 
    10 f1();
    11 
    12 console.dir(window.name);
    13 
    14 
    15 // 将 f 对象中 say 属性(say 为函数)赋值给 f1 变量,而此时,通过 f1()调用,此时,this 指向 window,并非 f 对象

     


     1 var f=function()
     2  {
     3    console.dir(this);
     4 
     5    var f1=function()
     6    {
     7 
     8     console.dir(this);
     9     console.dir(this===f);
    10 
    11    };
    12 
    13     f1();
    14 
    15  };
    16 
    17 f();
    18 
    19 // 在函数中,再定义一个函数时,同时,在外层函数中调用该函数,而此时 ,this 并非指向外层函数对象,而是指向 window

     参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions

      
     

  • 相关阅读:
    反调试:ZwQueryInformationProcess
    反调试:检测类名与标题名
    对某个区间操作(sort,stable_sort,parital_sort,parital_sort_copy,nth_element,is_sorted)
    数值算法(accumluate,inner_product,partial_sum,adjacent_difference,power,itoa)
    随机重拍与抽样(random_shuffle,random_sample,random_sample_n)
    分割(partition,stable_partition)
    子序列匹配(search,search_n,adjcent_find,find,find_if,find_first_of,find_end)
    MySQL管理实务处理
    MySQL触发器
    MySQL使用游标
  • 原文地址:https://www.cnblogs.com/Lumia1020/p/5301678.html
Copyright © 2020-2023  润新知