zoukankan      html  css  js  c++  java
  • 深入理解javascript原型和闭包(9)——this

    面试中常会问到对this对象的理解

    在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了,也就是说this总是指向函数的直接调用者,而非间接调用者。

    this的取值是执行环境的一部分,每次调用函数都会产生一个新的执行环境。

    情况一:构造函数

    构造函数就是用来new对象的函数。严格来说,所有的函数都可以new一个对象。但有些函数的定义是为了new一个对象,有些则不是。

    另外,构造函数的函数名首字母必须大写。例如:Object、Array、Function

    上面代码中,Foo就是一个构造函数,f1是Foo创建得。

    如果函数作为构造函数使用,那么其中的this就代表构造函数new出来的那个对象。

    但如果直接调用Foo函数,而不是new Foo(),情况就不一样了。

    这种情况下,this是指向window的,因为函数是在全局范围内调用的。

    情况二:函数作为对象的一个属性

    如果函数作为对象的一个属性,并且作为对象的一个属性被调用时,函数中的this指向该对象。

    上面代码中,fn()函数作为obj对象的一个属性被调用,此时函数里面的this指向obj对象。

    如果,fn()函数不作为obj的属性被调用,会是什么结果呢?

    上面代码中,fn函数被被赋值给了变量fn1,并没有作为obj的一个属性被调用,那么this就指向window。

    情况三:函数用call或apply调用

    当一个函数被call或apply调用时,this的值就取传入的对象的值。

    情况四:全局 & 调用普通函数

    在全局环境下,this永远指向window

    普通函数在调用时,其中的this也都是window。

    情况五:原型中的this

    上面代码中,f1是构造函数Fn函数new出来的,f1对象下面没有getName()方法,因此到创建该对象的函数的原型中去找,可以找到该方法。

    在Fn.prototype.getName函数中,this指向f1对象。因此可以通过this.name获得f1.name的值

    不仅仅是构造函数的prototype,在整个原型链中,this都是指向当前对象。

    因此,在面试中如果被问到对this对象的理解,可以回答下面几点:

    1、this总是指向直接调用者,而非间接调用者

    2、如果有new关键字,this总是指向构造函数new出来的那个对象,同时还继承了该构造函数的原型

    3、在DOM事件流中,this指向触发该事件的对象。在IE事件流中,this指向window。

    4、闭包里的this指向window

  • 相关阅读:
    ci中使用smarty
    php curl用法
    百万级访问网站前期的技术准备
    enctype="multipart/formdata" 文件上传
    【转】lnmp配置记录
    ActionScript实现两直线相交弧跨越算法
    Adobe Flex迷你教程 — ActionScript实现二维向量运算
    U盘启动安装Linux(转)
    Adobe Flex迷你教程 — 实现类似新浪微博评论消息容器
    Adobe Flex迷你教程 — 让Graphics的线响应事件。
  • 原文地址:https://www.cnblogs.com/endlessmy/p/8554907.html
Copyright © 2011-2022 走看看