【JS】JS中对于this的理解

一、对this的产生原因分析和了解

第一:this指的是函数运行时所在的环境。

第二:JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系(内存存储详细理解参考原文)。

总结如下:

对于普通对象的保存:实际对象属性的值就是值;

对于函数的保存:实际函数属性的值是函数的地址;(而函数本身,可理解为:它不属于任何一个对象,相当于一个全局对象

同时,函数,可以作为一个参数(值)被调用,被传播。同时,在函数体内部,允许引用当前环境的其他变量(可以引用当前环境的其他变量。但当前环境是不确定的,所以会出现不同的值)

二、this绑定详解

this 实际上是在函数被调用时发生的绑定,它指向什么地方完全取决于函数在哪里被调用。

2.1 默认绑定(绑定在全局作用域)

即在调用函数时,函数不带任何修饰,也就是“光秃秃”的调用(即没有任何修饰的调用),就会应用默认绑定规则, 默认绑定指向全局作用域。

注意:在 javascript 中,如果使用了严格模式,则 this 不能绑定到全局对象。(不是很理解,不过先记录下)

2.2 隐式绑定

当函数在调用时,如果函数有所谓的“落脚点”,即有上下文对象(即调用时.前面的对象)时,隐式绑定规则会把函数中的 this 绑定到这个上下文对象。

function say() {
    console.log(this.name)
}
var name = "global"
var obj = {
    name: "inside",
    say: say
}
var alias = obj.say // 设置一个简写   (1)
alias() // 函数调用 输出"global"  (2)

注意:隐式绑定时丢失上下文问题。

这个可以结合函数的存储理解为:obj.say只是一个函数地址,不是函数本身。所以调用时,还是在当前全局环境下调用。

2.3 显式绑定

javascript中提供三种显式绑定方法:apply,call,bind

apply call bind
相同点 applycall的用法基本相似 applycall的用法基本相似
不同点 apply(obj,[arg1,arg2,arg3,...]被调用函数的参数以数组的形式给出 call(obj,arg1,arg2,arg3,...)被调用函数的参数依次给出
作用 apply, call 的作用就是给函数绑定一个执行上下文,且是显式绑定的。但传入参数时会有所不同。 同左

注意:bind返回一个新函数,这个函数已经制定了执行上下文(这表示执行上下文在之后不可改变了),而返回这个新函数可以接受参数(即在绑定的执行上下文中,以参数为入参执行函数)。

2.4 new 绑定

new 绑定:指通过 new 操作符调用构造函数时发生的 this 绑定。

注意:在 javascript 中并没有其他语言那样的类的概念。构造函数也仅仅是普通的函数而已,只不过构造函数的函数名以大写字母开头,也只不过它可以通过 new 操作符调用而已。

实际上:new 和 bind 应该很类似。只是一个在创建时执行,一个在执行过程中执行。(不过还是很不同的,见下文区别)

2.5 bind 和 new 的区别

不过还是有区别的:bind只能被函数调用。而new 返回的是一个对象。即new 之后,函数的执行上下文就不可以被改变了,bind不行,显示绑定的三种形式都不行。所以new 绑定 的优先级最高。

2.6 四种绑定的优先级和区别:

默认绑定 < 隐式绑定 < 显式绑定 < new 绑定

注意:bind只能被函数调用。而new 返回的是一个对象。即new 之后,函数的执行上下文就不可以被改变了,bind不行,显示绑定的三种形式都不行。所以new 绑定 的优先级最高。

三、参考

  1. JavaScript 的 this 原理 - 阮一峰的网络日志 http://www.ruanyifeng.com/blog/2018/06/javascript-this.html
  2. JavaScript中this绑定详解 - 想到什么写什么 - SegmentFault 思否 https://segmentfault.com/a/1190000007101339

原文地址:https://www.cnblogs.com/buwuliao/p/9583651.html

时间: 2024-08-02 04:01:36

【JS】JS中对于this的理解的相关文章

关于js中this指向的理解总结!

关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解有些准确的),那么接下来我会深入的探讨这个问题. 例子1: function a(){ var user = " 小明"; console.log(this.user);

Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循环索引很简单,只需在循环中使用{{@index}}即可. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <META http-equiv=Content-Type content="text/html; charset=utf-

js代码中的闭包

作为一个后台开发人员了解前端非常重要,尤其是深处学校实验室做项目时前端把写好的代码直接给你,然后你在修改的时候.我经常做的就是修改前端的代码的HTML和后台交互的部分以及js的ajax部分,之后修改之后也会遇到很多问题,所以只能自己继续修改前端,学习了前端的不少知识. js的闭包是一个很重要的概念,在编写js代码中经常会被用到的,也是js的特色以及难点. 知道闭包首先得知道js的变量和作用域. 在js中变量不向C/C++/Java中那样,得先定义在使用,js中可以直接使用变量,比如: 1 n=1

浅谈JS闭包中的循环绑定处理程序

初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript的闭包特性. 前几天工作中写前端js代码时,遇到了遍历元素给它添加单击事件. (PS:之前也在<jQuery基础教程>第四版中看过讲循环绑定处理程序的内容,当时估计也没怎么用心看,所以没记起来.) 大神要是知道这类情况,可以关掉窗口,写这些主要是给像我一样的小白看的,谢谢! 先贴上错误的例子让大家

js文件中函数前加分号和感叹号是什么意思?

本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}();   !有什么用? 从语法上来开,JavaScript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单独的JS文件中,开头的分号是没有任何意义的,可以删掉. 叹号是逻辑运算符,是"非"的意思,常见这种写法 if(!true){}:而将运算符加载函数定义的前面,则是将函数看做一

编写高质量JS代码中

2.使用函数 函数给程序员提供了主要的抽象功能,又提供实现机制.函数可以独立实现其他语言中的多个不同的特性,例如,过程.方法.构造函数,甚至类或模块. 2.1 理解函数调用.方法调用以及构造函数调用之间的不同 针对面向对象编程,函数.方法和类的构造函数是三种不同的概念. 使用模式:1,函数调用 function hello(username){ return "hello" + username; } 2,方法调用 var obj = { hello : function(){ ret

js语法中运算符的二义性之逗号&ldquo;,&rdquo;的二义性

看到<js语言精髓与编程实践>中讲解的js语法中运算符的二义性之逗号的二义性,做些笔记 我们先来看看这两个例子: alert(eval('a=(1,2,3);'));//示例1 alert(eval('a=1,2,3;'));//示例2 结果是两者都会弹出3,这种用法产生的混乱,是因为逗号","既可以是语法分隔符,又可以是运算符所导致的.在上面的示例1,示例2中,逗号都被作为"连续运算符"在使用.示例1中的括号强制运算符,因此它的效果是运算如下表达式:

JS学习中....

这一周,算是最痛苦的一周了,Js的学习,Dom的理解,Js语言由于是若性语言,所以常遇到写错单词从而导致代码运行不出结果的情况,这就意味着我们写代码的时候得分外小心,分外细心了,下面这是一个简单的留言板. 标题: 姓名: 内容: body{ background-color: black; margin: 0px; padding: 0px; font-family: "微软雅黑"; color: #8f8f8f; } #div1{ width: 700px; height: 400p

JS运动中的封装的部分实用函数(框架)总结

JS运动中的封装的部分实用函数(框架)总结 前段时间学习JS运动时做的很实用的几个函数,应该可以称之为小的框架了,现在总结一下.为什么不当时就总结呢?我认为所谓总结不是趁着大脑中还残留着对新知识印象的时候将其写下来,而是过了一段时间之后再回头去看,将其重新拾起,这个时候一般会有对这些新东西的新看法和新的体会,我把这个过程称为"知识的发酵".对于我来说经过 "发酵"之后的带有自己的见解和体会东西才可以称之为总结. 下面分为几个版本来说,也反映了他们的进化过程,这几个函

vs 2012 调试不了js -- solution 中script document显示不出来

背景: 因为项目的需要,从ie8升级到ie11(并且自动更新安装了几个ie11的补丁),升级后想用vs2012 调试asp.net项目中的js 但是发现solution中script document项目没有在项目中运行时启动,js不能打断点(***的空心圈). 解决过程: 这个同组的同事以前遇到过,并且解决了,所以向他请教,无果,不知道怎么解决的... 搜索了一下不能打断点的提示信息,网上给的说法是高级设置ie中禁掉第三方的调试工具选项前面的勾去掉,无果:这个和我的问题没有关系. 之前有同事更