this指向问题(2)

4、显示绑定

  指的是apply、bind、call

  (1)、apply 和 call

    相同点: <1> 这两个方法的用途是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值,真正强大之处在于扩充函数赖以运行的作用域

        <2> 它们接收的第一个参数都是一样的:函数运行的作用域

区别:apply 接收的参数是一个数组或者是类数组(arguments),call需要把接收的参数一一列举出来
这个 call 接受的参数是可枚举的:
function foo(b,c){console.log(this.a,b,c);
}
var obj = { a:2,b:3}
foo.call(obj,5,6) // 2 5 6

apply接受的参数是数组或者 arguments

function foo(something){console.log(this.a,something);  // 2  3return this.a   something
}var obj = { a:2}var bar =function(){return foo.apply(obj,arguments);
}
var b = bar(3)  
console.log(b)   // 5

apply 还有一个作用是把数组展开

function f(x,y,z){console.log(x,y,z);  // 1,2,3
}
var a = [1,2,3]
f.apply(null,a)

这个是ES5中的写法,在 ES6 中已经抛弃了这种写法,ES6 的写法为:

 function f(x,y,z){console.log(x,y,z);  // 1,2,3
}
var a = [1,2,3]
f(...a)

(2)bind

MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数  加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
function foo(something){console.log(this.a,something);  // 2 5return this.a   something
}
var obj = { a:2}
var bar = foo.bind(obj,5)  // 这个东西是函数 foo
var b = bar(3)  
console.log(b);   // 7

5、优先级问题

new  > 显示绑定  > 隐式绑定  > 默认

call、apply、bind其实不止用于指定this,还有很多的用途。在这因为是讲 this 所以就不谈那些,后续我会继续写一些 this 的机制,以及前人是怎么替代 this 机制的。嗯.....    

因为刚开始写东西,所以可能有些东西表达的不是很清楚,可能有些东西看起来有点绕,如果有什么不懂得或者有问题的欢迎留言指正

 

 

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将要被淘汰的8种人

将要被淘汰的8种人 从朋友的空间你发现了这篇文章&#xff0c;觉得写的很有道理&#xff0c;把它转过来&#xff0c;以便时时提醒一下自己&#xff1a; 不景气的社会&#xff0c;一定会淘汰不争气的人。如何不被淘汰&#xff0c;只要你不在这八种人之内。如果你在其中之内&…

学习 AngularJs 终于有点进步了。

很庆幸&#xff0c;自己在7月股市最低点的时候上车了&#xff0c;&#xff0c;开始了在股市的第一票&#xff0c;现在还不知道会不会赚&#xff0c;虽然买的核电有点偏高&#xff0c;但是还是对国家大工业大工程有信心的&#xff0c;按照今天的走势应该赚不少&#xff0c;希望是…

泽西岛2.9及更高版本中的声明式链接

几个星期前几个月前&#xff0c;我正在寻找如何为Oracle Cloud项目设计新的REST API。 我计划要做的事情之一就是使用Marc Hadley在Jersey 1.x中创建的声明性链接注入。 可悲的是这并没有被转发移植然而&#xff0c;这样一个快速的聊天项目带动和我承担了使代码最新的小中型工作…

使用HTML5技术控制电脑或手机上的摄像头

移动设备和桌面电脑上的客户端API起初并不是同步的。最初总是移动设备上先拥有某些功能和相应的API&#xff0c;但慢慢的&#xff0c;这些API会出现在桌面电脑上。其中一个应用接口技术就是getUserMedia API&#xff0c;它能让应用开发者访问用户的摄像头或内置相机。下面就展示…

好的,每个接触Java字节码的人

Oracle诉Google一案认为&#xff0c;复制Java API的结构&#xff0c;序列和组织是侵犯版权的行为。 侵犯版权不仅是复制行为&#xff0c;而且还适用于拥有该作品副本的所有中间方。 那就是编写/编译任何JVM语言的人&#xff0c;以及在他们拥有的任何设备上都有JAR文件的人&…

手动安装boost库

手动安装boost库。 1,下载boost库&#xff0c;解压到目录。我解压的目录为D:\thirdParty。2&#xff0c;build bjam工具。 转到 D:\thirdParty\boost_1_37_0\tools\jam\src目录&#xff0c;执行build.bat即可生成bin.ntx86目录&#xff0c;里面有个bjam.exe&#xff0c;以后bui…

iSlide——图标库、图示库的用法

iSlide中&#xff0c;有一个“图示库”功能&#xff0c;主要功能是同时排列多块文字或多张图片。单击插图库&#xff0c;会弹出一个新的对话框。从中&#xff0c;可以选择权限、分类、数量数据和样式&#xff0c;也可以直接搜索。 下面就举一个例子&#xff1a;我要开一个班队会…

NSMutableDictionary中 setValue和setObject的区别

对于- (void)setValue:(id)value forKey:(NSString *)key;函数 官方解释如下 Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObject:forKey: 这就很明确的说明了setValue&#xff1a;forKey&#xff1a;中value能够为nil&…

IFrame标签的两个用法介绍

1. 作为弹出层铺底覆盖 大家如果做过那种黑色遮罩盖住整张页面&#xff0c;而碰巧用户用的是IE6&#xff0c;更碰巧的是页面上有select元素&#xff0c;那就有得头疼了&#xff08;原理就不在这里赘述了&#xff09;。我们会发现弹出的DIV没法遮住select, 轮到我们的iframe出场…

[C++ rudiment][转]typedef 使用

typedef似乎很简单&#xff0c;如typedef int integer&#xff1b;然而&#xff0c;这些简单的typedef语句容易让人产生一种误解&#xff0c;typedef就是一种宏替换,把后面的自定义类型替换成前面的已知类型&#xff0c;事实是这样的吗?显然不是&#xff01;首先可以肯定的是&…

预留空间过大的OutOfMemoryError

在分配一个应该很适合我为JVM提供的堆中的数据结构时&#xff0c;为什么会出现OutOfMemoryError&#xff1f; 这是我最近遇到的一个问题。 确实&#xff0c;当查看开发人员要完成的工作并通过-Xmx参数对提供给JVM的堆大小进行三重检查时&#xff0c;似乎确实存在着一些可疑之处…

查看系统剩余空间

1.剩余空间&#xff1a;df -h 2.追踪最耗费硬盘的文件位置 cd /du -h --max-depth1 | sort -rn 转载于:https://www.cnblogs.com/xiaobiaomei/p/10669159.html

【转】理解POCO

理解POCO(Plain Old CLR Object)先要理解POJO。 1、什么是POJO? POJO的名称有多种&#xff0c;pure old java object 、plain ordinary java object 等。  按照Martin Fowler的解释是“Plain Old Java Object”&#xff0c;从字面上翻译为“纯洁老式的java对象”&#xff0c…

『ExtJS』01 001. ExtJS 4 类的定义

ExtJS 4 类的定义类的定义与类方法的调用 样例代码// Define new class Vehicle under the Cookbook namespaceExt.define(Cookbook.Vehicle, {// class configuration goes hereManufacturer : Aston Martin,Model : Vanquish,getDetails : function() {alert(I am an this…

HashMap底层实现原理及面试问题

①HashMap的工作原理 HashMap基于hashing原理&#xff0c;我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时&#xff0c;它调用键对象的hashCode()方法来计算hashcode&#xff0c;让后找到bucket位置来储存值对象。当获取对象时&#xff0c;通过键对象…

Neo4j 2.1:传递节点ID与UNWIND

在发布Neo4j 2.1时&#xff0c;我们将具有UNWIND子句&#xff0c;该子句使处理事物集合更加容易。 在我的有关创建邻接矩阵的博客文章中&#xff0c;我们想要显示按字母顺序排列的前5个见面组中有多少人&#xff0c;然后检查其他各组中有多少人。 没有UNWIND子句&#xff0c;…

使用C#調用外部程式或是執行DOS命令

在.NET裡要如何調用外部程式呢?? 在.net裡&#xff0c;提供了Process類&#xff0c;提供我們強大的調用外部工具功能&#xff0c;並透過重新導向輸入與輸出&#xff0c;可以取得執行結果&#xff0c;下面就用一個例子來示範在一個WinForm裡輸入一個Dos命令&#xff0c;然後呼…

flex 学习篇 ---- 导航类容器

导航类容器需要使用<mx:ViewStack />。可以直接从ui设计器中拉控件过去舞台或者手动敲代码。 导航类容器就是相当于创建了一个菜单&#xff0c;然后按每个选项都可以进入到不同的页面。 创建了<mx:ViewStack>之后需要为它指定id号。 <mx:ViewStack id"vi…

SQLiteOpenHelper+ContentProvider的使用

效果图&#xff1a; PetDbHelper package com.example.admin.pets;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.example.admin.pets.PetContract.PetEntry;public class PetDb…

[Mac入门] 如果更快的打开程序或文件

今天有位网友问我在Windows下可以用CtrlR快速打开程序/文件夹等&#xff0c;在Mac下有没有相类似的功能&#xff1f;本文将介绍一些我的一般做法。 1.Windows下的CtrlR是什么&#xff1f; 我打算从解释CtrlR开始说起&#xff0c;希望朋友们别嫌烦&#xff5e;。Windows下系统全…