`
mdf1987
  • 浏览: 6947 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

javascript难点之二:有奶就是娘的this

阅读更多
接下来谈谈js里的一个非常让人费解的关键字:this
之所以让人费解,可能是应为先入为主的关系。从面向过程的编程到面向对象的编程,class和object让无数习惯面向过程的人挣扎了许久,即使是从java,c++基于类的继承到js基于对象的继承,也让我们一头雾水。学会了严谨的高级语言,反而对js这个太随便的小流氓无从下手,它的种种行为看在眼里匪夷所思,长着和别人一样的嘴脸,但是却做着不一样的勾当。众所周知,this在JAVA里只是只带对象本身或者说是类本身,但是在js里,同样的this,你却闹不明白它到底在代表谁,而且同一个this,此时代表A,彼时可能就代表B了。这就是所谓的动态语言么?编程的随意性的增加看似可以变的功能强大,但是,越随意越是不好管理,就像C的指针,用的好可以提高性能,但是一点小错误也是致命的,代码可读性直线下降。这不应该是编程语言的趋势。
闲话不多说了,看看this到底怎么回事。
This在JS标准里的定义:对于每个执行上下文,都有一个 this 值与其相关联。在控制进入执行上下文时,根据调用者和被执行代码的类型决定这个值。与执行上下文相关联的 this 值是非可变的。
执行上下文:当控制器转换到 ECMAScript 可执行代码时,控制器就进入了执行上下文。活动的执行上下文组成一个逻辑上的栈。逻辑栈上的顶层执行上下文即正在运行的执行上下文。
进入执行上下文:每个函数和构造器调用都要进入一个新的执行上下文,即使是函数在递归地调用自身。每次返回都会退出执行上下文。未被 catch 的异常抛出有可能退出一个或多个执行上下文。当控制进入执行上下文时,创建并初始化作用域链,进行变量初始化,并决定 this 值。作用域链的初始化,变量的初始化和 this 值的决定取决于进入的代码类型。
通过以上的一系列名词定义知道,this到底代表什么,取决于此时此刻哪一个对象在用这个执行上下文。
function who(){
alert(this.name);
}
这个函数就是一个简单的执行上下文。直接输出who()的话,调用这个函数的对象是window,而window里没有name这个属性, 所以窗口弹出的是空白,继续写一个对象
var me = {name:"haha"};
me.who = who;//把who方法复制给me里的who属性
me.who();//调用这个me 的who方法
这时候,输出为haha。
其他情况也类似,如果学过call方法的话,下面的就比较容易理解了,如果还没学过,可以看我下一篇文章,<javascript难点之三:没有见过的怪物call>。
who.call(me)输出也为haha,这时候,调用这个方法的对象是me。
最后总结一下,在java等语言中,this指代的就是对象自己,this在那个类里声明的,就指代哪个类和他的对象。JS中的this虽然从本质上来说,也是指代对象,但是不同的是,这个this到底是指代哪个对象,这要更具实际情况来判断,简单的说,就是找到执行this所在的上下文的那个具体的对象,如果没有这样定义的对象,默认是浏览器window对象在执行上下文。记住this代表了一个对象就对了,然后就是撕下this这个面具,看看面具后面到底是哪个对象在操纵的过程,啊,有点福尔摩斯的感觉了。
分享到:
评论

相关推荐

    javascript技术难点(三)之this、new、apply和call详解

    在JavaScript中,this主要有以下几种情况: 1. 全局/函数调用:当函数作为普通函数调用时,this指向全局对象,在浏览器环境中通常是window。例如: ```javascript function foo() { console.log(this); } foo...

    JavaScript中this指向.docx

    在JavaScript编程中,`this`关键字的使用及其指向问题一直是困扰很多开发者的难点之一。不同于传统面向对象编程语言如Java或C#中的`this`概念,JavaScript中的`this`在运行时绑定,并且其指向会根据调用函数的方式而...

    Javascript经典实用教程

    异步编程是JavaScript中的另一个难点。事件循环、回调函数、Promise、async/await等都是处理非阻塞I/O操作的重要工具。理解事件队列和宏任务/微任务的区别,有助于解决异步编程中的问题。 ES6及以后的版本引入了...

    Javascript技术难点之apply,call与this之间的衔接

    标题和描述所包含的知识点是关于JavaScript中apply、call方法以及它们与函数中的this关键字之间的关系。apply和call是JavaScript中的两个方法,它们都用于改变函数内部的this指向,但有所不同。 apply方法接受两个...

    JavaScript 5.CHM

    而this的指向问题,是JavaScript初学者常遇到的难点,它根据函数的调用方式(方法调用、构造调用、普通函数调用和apply/call/bind调用)有所不同。 对象和原型是JavaScript的特色,了解原型链、__proto__属性、...

    你有必要知道的10个JavaScript难点

    本文将深入探讨JavaScript中的几个高级概念,包括立即执行函数表达式(IIFE)、闭包、私有变量的定义、原型链以及模块化编程等难点,帮助开发者更好地理解和运用这些知识。 1. 立即执行函数表达式(IIFE) 立即执行...

    循序渐进的javascript范例资料

    特别是this,它在不同环境下有不同的指向,是JavaScript中的难点之一。 范例是学习编程语言的最佳途径。通过实际编写和分析代码,你可以更好地掌握JavaScript的语法和用法。比如,可以学习如何使用DOM API来操作...

    本文件是涉及到javascript的高级部分学习,也就是难点部分的学习,之后我也会更新js的其他难点部分,感兴趣的小伙伴可以下载

    本文件主要涉及到:this指向问题,闭包,沙箱模式,函数柯里化,继承等知识点,适合已经学习完js基础的小伙伴(js基础可以去看我的前面的专栏:js每日一学),感兴趣的小伙伴可以下载下来自行阅读学习。 本文件是纯...

    JavaScript中this用法学习笔记

    JavaScript中的`this`关键字是许多开发者在学习过程中遇到的一个难点,因为它的行为并不是根据函数定义的位置来决定,而是根据函数的调用方式。在本文中,我们将深入探讨`this`的四种主要绑定规则:默认绑定、隐式...

    一个有趣而棘手的JavaScript示例列表.zip

    JavaScript,作为全球最广泛使用的编程语言之一,是创建交互式网页和动态应用的关键工具。这个压缩包"一个有趣而棘手的JavaScript示例列表.zip"显然包含了一系列旨在挑战和拓展开发者技能的示例代码。这些示例可能...

    网易高级前端工程师跟着他每周重点攻克一个前端面试重难点

    "网易高级前端工程师跟着他每周重点攻克一个前端面试重难点"这个项目,旨在帮助开发者系统性地提升自己的JavaScript技能,应对各种前端面试挑战。 在JavaScript的学习过程中,有几个关键的知识点是每个前端工程师都...

    JavaScript的继承实现小结

    最近在忙前端的工作,因为之前做.net和php的开发比较多,前端开发喜欢把库拿来就用,几次事实证明,不懂原理,连改代码也改不好,所以还是下定决心研究下JavaScript的几个技术难点。 0x1.JavaScript的对象和构造函数...

    选中一级复选框,相关二级或父级同时被选,取消也是

    标题与描述中的知识点:“选中一级复选框,相关二级或父级同时被选,取消也是”,这描述了一个在前端开发中常见的功能需求——多级复选框联动。这种功能通常应用于具有层级关系的数据选择场景,如文件系统、组织结构...

    【JavaScript源代码】js制作轮播图效果.docx

    ### JavaScript 制作轮播图效果详解 #### 一、轮播图的重要性和应用场景 轮播图(也称为幻灯片、广告轮播等)在前端网页设计中扮演着非常重要的角色。它不仅可以用于展示产品图片、新闻资讯、广告宣传等内容,还...

    教你如何使用firebug调试功能了解javascript闭包和this

    主要介绍了教你如何使用firebug调试功能了解javascript闭包和this,javascript的调试也是一个比较大的难点,很多基础的东西都需要自己去摸索,这里将自己的经验分享给大家,希望对大家能够有所帮助

    atguigu-js:尚硅谷 JavaScript练习

    异步编程是JavaScript中的难点,包括回调函数、Promise、async/await等。这些是处理非同步任务,如网络请求、定时器、文件读写等场景的基础。 与HTML的交互是前端开发的日常,JavaScript可以操作DOM(文档对象模型...

    浅谈js中的this问题

    JavaScript中的`this`关键字是一个非常重要的概念,它在不同场景下有不同的指向,有时可能会引起混淆。`this`的指向在函数定义时无法确定,只有在函数执行时才会根据调用方式来决定。以下是对`this`指向的一些详细...

    JS函数this的用法实例分析

    this关键字的灵活使用是JavaScript编程中的一个难点,也是高级特性。正确地理解和使用this可以使得代码更加模块化、更加易于维护。在实际开发中,理解this的指向对于避免错误、实现复杂功能都至关重要。 希望本文...

    JavaScript学习历程和心得小结

    this的指向在不同上下文中可能有所不同,这是JavaScript相对于其他面向对象语言的一大特点,也是许多初学者遇到的难点。理解this的工作原理,可以帮助开发者正确地编写和调用对象方法,避免在作用域和闭包中出现错误...

Global site tag (gtag.js) - Google Analytics