js call回调的this指向问题
function fn1(){
console.log(1);
}
function fn2(){
console.log(2);
} fn1.call(fn2); //输出 1 fn1.call.call(fn2); //输出 2
对于 fn1.call(fn2);我能够理解,这段代码仅仅 使得 fn1对象的this指向了fn2;但是最终不影响fn1函数的执行。因为fn1中不包含对this的操作。
A.call( B,x,y ):就是把A的函数放到B中运行,x 和 y 是A方法的参数。
面试题:
function fn(a,b){
console.log(this);
console.log(a);
console.log(a+b);
}
fn.call(1);
fn.call.call(fn);
fn.call.call.call(fn,1,2);
fn.call.call.call.call(fn,1,2,3); 答案:
fn.call(1); // 1,undefined,NaN
fn.call.call(fn); // fn,undefined,NaN
fn.call.call.call(fn,1,2); // 1,2,NaN
fn.call.call.call.call(fn,1,2,3); // 1,2,5 深层解题思路:
fn.call(1);call的第一个参数改变call前面函数里的关键字this所以输出1;后面没有参数所以a,b为undefined,相加结果为NaN;
fn.call.call(fn);这一块是个难点,不过也很好理解! fn.call 找到Function.prototype上的call方法(这也是一个函数,也是函数类
的一个实例,也可以继续调用call/apply等方法)我们可以把fn.call看成一个函数 A 那么接下就等于A.call(fn),这
里执行call方法,把 A 中的关键字this修改为函数 fn ,然后再把函数 A(fn.call) 执行;
fn.call.call.call(fn,1,2);通过上一条的原型链的方法我们可以把 fn.call.call.call 看成 A(fn.call.call).call 执行,此时括
里的参数 fn 已经作为函数执行了,所以就成了 A.call(1,2) 执行!1作为第一个参数改变 call 前面函数里的this,
后面的参数作为实参传递到函数的形参里!
fn.call.call.call.call(fn,1,2,3); 同上一条原理! 概括性总结:
不怎么理解的话也可以记住这个概括性诀窍:
碰到两个及两个以上的call都是让第一个参数执行,第一个参数必须是函数;
第二个参数是改变第一个参数中this;
第三个及第三个以后的参数作为实参传给第一个参数。
js call回调的this指向问题的更多相关文章
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
- C“中断” 与 JS“异步回调” 横向对比
在底层C语言中,有一个非常重要而特别的概念,叫做“中断”.用比喻来说,我正在写着博客,突然我妈打个电话过来,我就离开了键盘去接电话了,然后写博客就中断了,我聊完电话回来再继续写.乍一听似乎并没有什么大 ...
- js的回调函数详解
本文主要介绍了个人对于javascript中回调函数的理解和使用方法及示例,需要的朋友可以参考下 现在做native App 和Web App是主流,也就是说现在各种基于浏览器的web app框 ...
- 从Ecma规范深入理解js中的this的指向
this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java.c++这类比较严格的面向对象编程语言里是非常明确的.但是在javascript中,this的定义要灵活许多,如果 ...
- co.js异步回调原理理解
co.js是基于es6的generator实现的,相当于generator函数的一个自动执行器 generator的简单介绍 function* fn(){ before() yield firstY ...
- js中回调函数(callback)的一些理解
前言 我个人在学习Node.js相关知识时遇到了回调函数这个概念,虽然之前已经在c,c++等编程语言中用到过它,但还一直未对其机制有深入了解,这次就来好好谈一下它. 概念理解 百度对它的解释是回调函数 ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- js的回调函数 一些例子
这边用bootstrap 3.0的 上传控件做例子 下面是上传控件的一段完整的 js 操作 代码. <!-- 上传缩略图控件配置 --><script> // 定义这四个全局 ...
- JSF页面中使用js函数回调后台bean方法并获取返回值的方法
由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...
随机推荐
- python标准库中socket模块详解
包含原理就是tcp的三次握手 http://www.lybbn.cn/data/datas.php?yw=71 这篇讲到了socket和django的联系 https://www.cnblogs.co ...
- servlet容器、IOC容器、SpirngMVC
servlet容器(这里指tomcat插件)存放servlet对象,而SpringMVC框架整个是一个servlet对象,而IOC容器 在Boot框架中,会存放产生servlet容器的工厂,工厂依据主 ...
- Python 编程快速上手 第九章 组织文件
上一章节,主要讲了如何用 Python 进行创建并写入新文件.这一章节,讲了对如何用 Python 对文件进行进一步的操作,包括: 移动,复制,删除文件 改名 压缩文件 [shutil]移动,复制,删 ...
- 混合线性模型(linear mixed models)
一般线性模型.混合线性模型.广义线性模型 广义线性模型GLM很简单,举个例子,药物的疗效和服用药物的剂量有关.这个相关性可能是多种多样的,可能是简单线性关系(发烧时吃一片药退烧0.1度,两片药退烧0. ...
- English trip EM2-LP-6A Teacher:Julia
课上内容(Lesson) How many children are in the family? there are 16 kids How old is the oldest child? He' ...
- jQuery -- touch事件之滑动判断(左右上下方向)
$("body").on("touchstart", function(e) { // 判断默认行为是否可以被禁用 if (e.cancelable) { // ...
- Robot Movement(机器人移动)
中文标题[机器人移动] 这个题目是 Kayak 发布的代码挑战题目. 我认为题目本身描述的不是十分清楚,方法需要返回结果,但是结果没有说明是机器人最后的坐标位置,还是最后的坐标位置距离原点的距离.同时 ...
- 第二阶段——个人工作总结DAY06
1.昨天做了什么:昨天做完了修改密码的界面.(有点丑) 2.今天打算做什么:今天制作时间轴. 3.遇到的困难:无.
- Ubuntu下忘记MySQL root密码解决方法
1.忘了mysql密码,从网上找到的解决方案记录在这里. 编辑mysql的配置文件/etc/mysql/my.cnf,在[mysqld]段下加入一行“skip-grant-tables”. 2.重启服 ...
- Maximum sub array
Here I post a way to solve maximum sub array problem: The problem described like this: here is an ar ...