摘要:是的,始终指向调用对象,调用对象,这个很重要,的静态成员是没有的概念的。所以和,的区别是返回一个明确的新函数,和立即执行了。
1. 问题引入
function A() {} A.prototype.fna = function() { console.log(this); }
我的问题是 fna 的 this 是指向哪里的?
var a = new A(); a.fna(); // A {} var fnt = a.fna; fnt(); // window {...}
再看我们经常遇到的情形
function A() { this.name = "A"; } A.prototype.fna = function() { return this.name; } function sayName(fn) { console.log(fn()); } var a = new A(); sayName(a.fna); //undefined sayName(a.fna.bind(a)); //A
这里就是我们平时在写代码的时候为什么要调用 bind 函数来绑定上下文
function A() { this.fna = function() { console.log(this); } } A.prototype.getFna = function() { return this.fna; } function sayContext(fn) { fn(); } var a = new A(); var fna = a.getFna(); sayContext(fna); //window
为什么会有以上这种情况呢,在 java 中 this 是始终指向调用对象的。是的,始终指向调用对象,调用对象,这个很重要,java 的静态成员是没有 this 的概念的。在 javascript 中 this 只和函数的执行环境有关。只有三种情况,在浏览中 window、调用对象、严格模式下的undefined,对应我们开发者来说能接触到的就是以上三者,所以我们可以理解为 函数的执行环境就是以上三者。
2. 确定 this 指向我们如何确定 this 的指向呢,有很多文章介绍 this 确定指向,方式也有很多种,而我是根据函数的调用形势去判断的,有以下两个判断标准。
1 如果函数的最终调用形式是 fn(); 那么在非严格模式下 this 指向 window 对象,在严格模式下指向 undefined
2 如果是通过对象调用 o.fn(); 这种形式 this 指向对象 o
是的就这两个标准,就这么简单。
3. 通过 call 、apply、bind 深入理解 this函数调用原型
fn.call(thisArg, arg1, arg2, ...)
fn.apply(thisArg, [argsArray])
fn.bind(thisArg[, arg1[, arg2[, ...]]])
上面这三个函数都是用来改变函数的 this 指向的
1 call 第一个参数是 fn 中 this 的期望指向,值可以是 对象 或者 undefined,后面的参数是要传递 给 fn 的参数列表
2 apply 第一个参数是 fn 中 this 的期望指向,值可以是 对象 或者 undefined,后面的值是 fn 的 参数,是一个数组
call 和apply 功能相同,唯一不同的是选择将参数以 参数列表 传入或者以 数组 传入,都可以,可以互换
使用。调用者两个函数会立即执行 fn,这里是立即执行
3 bind 第一个参数是 fn 中 this 的期望指向,值可以是 对象 或者 undefined,后面的参数是要传递 给 fn 的参数列表
调用 bind 函数会返回一个函数,这个函数是 fn 的包装,和 fn 的唯一区别是绑定了 this,即 this指向明确。所以 bind 和 call、apply,的区别是 bind 返回一个 this 明确的新函数,call 和 apply立即执行了 fn。
到这里我想 javascript 的 this 已经说的很清楚了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/83941.html
摘要:现在我们从实现一个简易的方法开始探索其中的机制。其中内部的可以将上一个的返回值传递给外部。一言以蔽之实现了递归调用的方法。当执行到的中间件没有时并且返回的为时逆序执行。 本文发布在github.com/ssssyoki,欢迎star,issues共同交流。 Koa是基于Node.js的下一代web开发框架,相比Express更轻,源码只有几百行。与传统的中间件不同,在Koa 1.x中采...
摘要:至于,其只是以数组的方传入参数,其它部分是一样的,如下它们也可用于在中的类继承中,调用父级构造器。间接调用,调用了父级构造器对比方法和,它俩都立即执行了函数,而函数返回了一个新方法,绑定了预先指定好的,并可以延后调用。 其实this是一个老生常谈的问题了。关于this的文章非常多,其实我本以为自己早弄明白了它,不过昨天在做项目的过程中,还是出现了一丝疑惑,想到大概之前在JavaScri...
摘要:看了高级程序设计中关于对象的介绍,记录一下对于其中有些地方的疑惑。 看了《JavaScript高级程序设计》中关于对象的介绍,记录一下对于其中有些地方的疑惑。 使用构造函数创建对象时,prototype中如果定义一个属性指向函数,在函数中引用this,为什么this是指向构造函数而不是prototype对象? 试验: function SuperType() { this.pr...
摘要:百炼成仙走红该书于年月出版,作者杨逸飞是一名从事开发六年的程序员,写过诸多技术博客。作者在博客上对粉丝提出关于百炼成仙的问题进行了统一回复,该博文持续占据热榜第二,热度达。 刚接触编程的小伙伴,估计都想过把枯燥无聊的编程教材变成小说读的念头,这不,说曹操曹操就来了,真的有程序员用写修仙小说的...
摘要:由于匿名函数的作用域是全局性的,因此闭包的通常指向全局对象调用返回值为而不是我们预期的,在闭包中函数作为某个对象的方法调用时,要特别注意,该方法内部匿名函数的指向的是全局变量。 有人的地方就有江湖,有函数的地方就有this。而this在不同的环境下,又表现为不同的形式,难免让人有种此this非彼this的疑惑 在java等面向对象的语言中,this指的就是当前对象,而在jav...
阅读 3218·2021-09-22 16:06
阅读 3213·2021-09-02 15:40
阅读 611·2019-08-30 15:54
阅读 1016·2019-08-26 12:22
阅读 1349·2019-08-26 12:17
阅读 2729·2019-08-26 12:09
阅读 436·2019-08-26 10:20
阅读 763·2019-08-23 16:28