JS的this指向深入】的更多相关文章

  前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰:而面向过程的语言也只有C语言老大哥依然坚挺:现在主流的语言(例如Java.C++.PHP等)都是面向对象的语言. 而我们的JavaScript语言,恰恰介于面向过程与面向对象之间,我们称它为"基于对象"的语言.但是,JS中的OOP依…
关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(虽然在很多情况下那样去理解不会出什么问题,但是实际上会有些特殊存在),那么接下来我会深入的探讨这个问题. 例子1: function a(){ var user = " 小明"; console.log(this.user); //undef…
Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype.call2 1.3. 在函数内部出现的this,指什么要看这个this所在的函数的被调用方式. 不论这个this出现在什么样的函数中,层次有多深,结构多复杂,只要看直接包含它的函数即可.例如:  (1) 被直接调用时,this指全局对象window.3 2. ref3 1.1. 出现地点and解决…
js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的this四种绑定形式 this指向及改变this指向的方法 二. this显示绑定和隐式绑定 1. this显示绑定  含义: 当一个函数没有明确的调用对象的时候, 也就是单纯作为独立函数调用的时候, 将对函数的this使用默认绑定: 绑定到全局的window对象  在显式绑定下: 函数将取得在"…
js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window,普通函数的自执行会进行预编译,然后预编译this的指向是window //全局作用域 console.log(this);//Window //普通函数 function fn(){ console.log(this); //Window } fn(); //函数加括号调用叫函数自执行,函数自执行时,内部的this指向顶层对象/window 二.事件函数内部的this指向事件源:注意在事件函数中如果包…
JS中this指向的更改 JavaScript 中 this 的指向问题 前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改this指向 call 的使用语法:func.call(thisArg, arg1, arg2, ...) call 方法需要一个指定的 this 值( this要指向的对象 )和一个或者多个参数.提供的 this 值会更改调用函数内部的 this 指向. // 使用 call 方法改变调用函数执行…
js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对象,例如: var obj ={ ccc : 1122, ddd : 2233, ded : function(){ console.log(this); } , fff : function(){ console.log(this === obj ); } } obj.ded(); obj.fff…
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论区评论不同之处),对比来看,验证与自己现有知识是否有盲点,多看几篇,自然就会完善自身知识. 附上之前写文章写过的一段话:已经有很多关于this的文章,为什么自己还要写一遍呢.学习就好比是座大山,人们沿着不同的路登山,分享着自己看到的风景.你不一定能看到别人看到的风景,体会到别人的心情.只有自己去登山…
说到this,入前端坑的人都知道这是JS初期语言毕竟之路.很多人(我就是)对于this的了解很模糊,或者不够全面.最近打算在反过来在看下es6,在es6中又出现了箭头函数对于this的理解有多了层认识.所以就在写一遍来加强自己的认知. 在讲this之前,我们先把作用域链在复习一下 在红宝书中对作用域链的描述有这么一句话:当代码在一个环境中执行时,会创建变量对象的一个作用域链.作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问简单来说,作用域链的作用就是在函数使用一个变量的时候,由近…
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.好处:在出现大量程序相同的时候,可以封装为一个function,这样只用调用一次,就能执行很多语句.(1)语法:函数就是包裹在花括号中的代码块,前面使用了关键词 function:eg:function myFunction(){ //执行的代码}//调用.myFunction();<button onclick="myFunction()">点击</button>(2)参数function小括号中的参…
首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的是那个调用它的对象(虽然在绝大多数情况下这样理解不会出问题,但实际上是不准确的). 1.默认执行 例子1: function fn(){ var user = "admin"; console.log(this.user); //undefined console.log(this); /…
js中修改this的指向 方法整理 call,apply,bind 以上的三哥方法都是用来改变js中this的指向 call 使用方法:fun.call(thisArg[,arg1[, arg2[, ...]]]) 该方法传递一个thisArgs和一个参数列表,thisArgs制定了函数在运行中的调用者,也就是函数中的this对象,而参数列表会被传入调用函数中. call 方法可以在一个对象上借用另一个对象的方法 案例:Object.prototype.tostring.call([]).一个A…
this的绑定规则有4种 默认绑定 隐性绑定 显性绑定 new绑定 this绑定优先级 new 绑定 > 显性绑定 > 隐性绑定 > 默认绑定 1.如果函数被new 修饰 this绑定的是新创建的对象,例:var bar = new foo(); 函数 foo 中的 this 就是一个叫foo的新创建的对象 , 然后将这个对象赋给bar , 这样的绑定方式叫 new绑定 . 2.如果函数是使用call,apply,bind来调用的 this绑定的是 call,apply,bind 的第一…
  在面向对象的语言中(例如Java,C#等),this 含义是明确且具体的,即指向当前对象.一般在编译期绑定. 然而js中this 是在运行期进行绑定的,这是js中this 关键字具备多重含义的本质原因.下面就让我们一起来分析一下具体情况. 由于js中this 是在运行期进行绑定的,所以js中的 this 可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种方式: 作为对象方法调用 作为函数调用 作为构造函数调用 使用 apply 或…
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?如果你学过面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章…
前言 JavaScript 中最大的一个安全问题,也是最令人困惑的一个问题,就是在某些情况下this的值是如何确定的.有js基础的同学面对这个问题基本可以想到:this的指向和函数调用的方式相关.这当然是正确的,然而,这几种方式有什么联系吗?这是我接下来要说明的问题. this从哪里来 this 是js的一个关键字,和arguments类似,它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用.这句话似乎与认知不同,我们在函数体外部即全局作用域下也能使用this. // 直接在全…
JS中的this对象详解   JS中this关键字很常见,但是它似乎变幻莫测,让人抓狂.这篇文章就来揭示其中的奥秘. 借助阮一峰老师的话:它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.这句话看似平常,可是要非常注意三个字:"运行时",这说明this关键字只与函数的执行环境有关,而与声明环境没有关系.也就是这个this到底代表的是什么对象要等到函数运行时才知道,有点类似函数定义时的参数列表只在函数调用时才传入真正的对象.理解了这一点对后面this关键字规律的掌握有很大帮助…
1.在全局范围内使用this的时候  它指向的是全局对象 this Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…} 2.方法调用模式 test.foo(); //这里调用会吧 this指向test对象 3.函数调用 alert(); //这里的this是 全局 //这里有些问题 一些对象内部的方法 直接调用会默认是全局对象上 . //使用 var _this=t…
概括:this指向在函数定义的时候是无法确定的,只有在函数调用执行的时候才能确定this最终指向了谁,this最终指向的是调用它的对象(常见的说法,后面有小小的纠正): 例1: 图中的函数fn1其实是window对象下面的一个方法,相当于window.fn1()调用了这个方法,而name是fn1的私有变量,所以全局下是没有name这个变量的,所以结果如上所示,this最终指向的也是window这个对象. 例2: 此时this指向的是obj对象,因为fn2是通过obj调用的,所以可以理解this最…
普通函数:this指向分为4种情况,1. obj.getName();//指向obj2.getName();//非严格模式下,指向window,严格模式下为undefined3. var a = new A();   a();//指向A本身4.getName().apply(obj);//指向obj 箭头函数:箭头函数本身是没有this和arguments的,在箭头函数中引用this实际上是调用的是定义时的上一层作用域的this.这里强调的是上一层作用域,是因为对象是不能形成独立的作用域的.例如…
总结:this指向调用函数的那个对象. 在不同的应用场景this的指向有所不同,但细细思考都符合总结的意思. 场景一:一般的函数调用 这种常见的函数调用方式this指向的是window,因为相当于是window对象调用的函数. var name = "window"; function test(){ this.name = "local"; } test();//window.test(); alert(name);// local window.name 属性被…
最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1.改变函数内部的this指向的三种方法:call(),apply(),bind() 2. 相同点:都可以改变this指向. 都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. 一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向. ca…
JavaScript由于在运行期进行绑定的特性,JavaScript中的this可以是全局对象,当前对象或者任意对象,这完全取决于函数的调用方式 1.全局作用域或者普通函数中this指向全局对象window console.log(this);//window //函数声明 function bar(){ console.log(this); } bar();//window //function声明函数赋给变量 var bar = function () { console.log(this)…
问题:在外部单独使用类实例对象的方法,this没有指向该类实例对象 代码如下 class CQH { hello() { let name = this.name(); console.log(`Hello ${name}`); } name() { return "chenqionghe" } } const cqh = new CQH(); const hello = cqh.hello; hello(); 运行报错,找不到this let name = this.name();…
请阅读以下代码:var obj = {};obj.log = console.log;obj.log.call(console, this)该代码在浏览器中执行,输出的日志结果是什么? 这道题就是问console.log.call(console,this)打印出什么,这道题很容易引导人走向误区,因为我们知道call方法就是改变this的指向,但是这个被改变的this是log函数体内的this,而不是题目中作为参数传入的this,作为参数的这个this是指向window的.  …
this指向的,永远只可能是对象! this指向谁,永远不取决于this写在哪!而是取决于函数在哪调用. this指向的对象,我们称之为函数的上下文context,也叫函数的调用者. 1:通过函数名直接调用:this指向window function func(){ console.log(this); } //① 通过函数名()直接调用:this指向window func(); // this--->window 2:通过对象.函数名()调用的:this指向这个对象 function func…
call.apply.bind的作用是改变函数运行时this的指向. 如果你传的 context 就 null 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined) 函数运行时,有三种调用方法. 方法调用模式 var a = 1 var obj1 = { a:2, fn:function(){ console.log(this.a) } } obj1.fn()//2 this是指obj1这个对象,obj1.fn()…
this指向深入 this的绑定规则 默认绑定 this默认指向了window 全局环境下this指向了window 函数独立调用,函数内部的this也指向了window <script> function fn(){ console.log(this); } fn(); </script> 函数被嵌套的函数独立调用时,this默认指向了window 函数当做对象的方法来调用时,this指向了obj <script> var obj = { a:2, foo:funct…
先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 apply 不需要手动调用 第一个参数 this 要指向的对象,后面是 数组参数 看下具体代码 bind function fn(a,b) { console.log(a,b) console.log(this,'this') } fn(1,2) // 1 2 // Window 'th…
一.this指向 点击打开视频讲解更加详细 this随处可见,一般谁调用,this就指向谁.this在不同环境下,不同作用下,表现的也不同. 以下几种情况,this都是指向window 1.全局作用下,this指向的是window console.log(window); console.log(this); console.log(window == this); // true 2.函数独立调用时,函数内部的this也指向window function fun() { console.log…