首页

JavaScript 中的 call()、apply()、bind() 的详解

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

三种方法的作用

在 JavaScript 中

  1. callapply 和 bind 是 Function 对象自带的三个方法,都是为了改变函数体内部 this 的指向。
  2. callapply 和 bind 三者第一个参数都是 this 要指向的对象,也就是想指定的上下文
  3. callapply 和 bind 三者都可以利用后续参数传参。
  4. bind 是返回对应 函数,便于稍后调用;apply 、call 则是立即调用 。
举个栗子
function fruits() {}

fruits.prototype = {
   color: 'red',
   say: function() { console.log('My color is ' + this.color); 
   }
} var apple = new fruits;
apple.say(); // 此时方法里面的this 指的是fruits // 结果: My color is red
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

如果我们有一个对象 banana= {color : 'yellow'} ,我们不想重新定义 say 方法,那么我们可以通过 call 或 apply 用 apple 的 say 方法:

var banana = { color: 'yellow' };
apple.say.call(banana); // 此时的this的指向已经同过call()方法改变了,指向的是banana,this.color就是banana.color='yellow'; // 结果是My color is yellow 

apple.say.apply(banana); // 同理,此时的this的指向已经同过apply()方法改变了,指向的是banana,this.color就是banana.color ='yellow'; // 结果是My color is yellow

apple.say.apply(null); // nullwindow下的,此时,this 就指向了window ,但是window下并没有clolr这个属性,因此this.clolr就是window.color=undefined; // 结果是My color is undefined
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
call 和 apply 的区别

二者的作用完全一样,知识接受 参数 的方式不太一样。

call 是把参数按顺序传递进去,而 apply 则是把参数放在 数组 里面。

var array1 = [12,'foo',{name:'Joe'},-2458]; var array2 = ['Doe' , 555 , 100]; Array.prototype.push.call(array1, array2); // 这里用 call 第二个参数不会把 array2 当成一个数组,而是一个元素 // 等价于 array1.push("'Doe' , 555 , 100"); // array1.length=5; Array.prototype.push.apply(array1, array2); // 这里用 apply 第二个参数是一个数组 // 等价于:  array1.push('Doe' , 555 , 100); // array1.length=7;
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
类(伪)数组使用数组方法
var divElements = document.getElementsByTagName('div'); // 虽然 divElements 有 length 属性,但是他是一个伪数组,不能使用数组里面的方法 Array.isArray(divElements);// false var domNodes = Array.prototype.slice.call(document.getElementsByTagName('div')); // 将数组对象 Array 里的 this 指向伪数组 document.getElementsByTagName('div'),  // slice() 方法可从已有的数组中返回选定的元素,不传参数是,返回整个数组  Array.isArray(domNodes);// true
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
验证一个对象的类型可以用
Object.prototype.toString.call(obj)
    
  • 1
bind() 方法

bind() 方法会创建一个 新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind() 方法的第一个参数 作为 this,传入 bind() 方法的 第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

注意bind()方法创建的函数不会立即调用,在下面的例子中,最后 func() 才调用了函数,这是它与 callapply的区别。

var bar = function(){ console.log(this.x);
} var foo = {
    x:3 }
bar(); // undefined var func = bar.bind(foo); //此时this已经指向了foo,但是用bind()方法并不会立即执行,而是创建一个新函数,如果要直接调用的话 可以bar.bind(foo)() func(); // 3
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在 Javascript 中,多次 bind() 是无效的。更深层次的原因, bind() 的实现,相当于使用函数在内部包了一个 call / apply ,第二次 bind() 相当于再包住第一次 bind() ,故第二次以后的 bind 是无法生效的。

var bar = function(){ console.log(this.x);
} var foo = {
  x:3 } var sed = {
  x:4 } var func = bar.bind(foo).bind(sed);
func(); //3 var fiv = {
  x:5 } var func = bar.bind(foo).bind(sed).bind(fiv);
func(); //3

JavaScript 字符串实用常操纪要

蓝蓝设计的小编

JavaScript 字符串用于存储和处理文本。因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Date 时,诸此等等,繁不能数;而她那满多的 API 呵,总有些让人不愿去记忆的冲动,既然用时常搜,倒不如烂笔头一翻,顺道也体现下博客存在的价值,由此就有了这篇纪要。

字符串截取

1. substring()

xString.substring(start,end)

substring()是最常用到的字符串截取方法,它可以接收两个参数(参数不能为负值),分别是要截取的开始位置和结束位置,它将返回一个新的字符串,其内容是从start处到end-1处的所有字符。若结束参数(end)省略,则表示从start位置一直截取到最后。

JavaScript之this指针深入详解

蓝蓝设计的小编

javascript中的this含义非常丰富,它可以是全局对象,当前对象或者是任意对象,这都取决于函数的调用方式。函数有以下几种调用方式:作为对象方法调用、作为函数调用、作为构造函数调用、apply或call调用。

对象方法调用

作为对象方法调用的时候,this会被绑定到该对象。

var point = { 
 x : 0, 
 y : 0, 
 moveTo : function(x, y) { 
     this.x = this.x + x; 
     this.y = this.y + y; 
     } 
 }; 

 point.moveTo(1, 1)//this 绑定到当前对象,即 point 对象

Node.js新手必须知道的4个JavaScript概念

蓝蓝设计的小编

如果只需要知道一种编程语言就可以构建一个全栈的应用程序,是不是特别了不起?Ryan Dahl为了把这个想法成为现实,创造了node.js。Node.js是建立在Chrome强劲的V8 JavaScript引擎上的服务器端框架。虽然最初是用C++编写的,但是应用程序通过JavaScript运行。

这样一来,问题就解决了。一种语言就可以统治一切。而且,在整个应用程序中你只需要使用这一种语言。所以,我们需要深刻了解node.js。这就是本文的主题。

下面这四个基本概念是你想要掌握node.js所必需的。我会尽可能长话短说向大家介绍它们。

logo-nodejs.jpg

详解 javascript 的类

蓝蓝设计的小编

前言

生活有度,人生添寿。

Javascript从当初的一个“弹窗语言”,一步步发展成为现在前后端通吃的庞然大物。javascript的受欢迎程度也是与日俱增,今年编程语言又是花落javascript,这实在是一个充满了活力的语言。如今,随随便一个网页javascript代码量都不下数千行,要是node后端那更不止几千行了。(WTF)代码量的增加给编程带来的首要的问题就是如何去编写和维护如此庞大的代码呢?答案就是模块化思想,其实就是面向对象(OOP)编程,如今比较流行的三大前端框架(angular,react,vue)基本都实现了组件化编程,但组件化和我们所说的模块化又有所不同,应该可以这么理解,组件化是模块化的升级版,模块化是组件化的基础。那么,问题来了,javascript怎么面向对象编程呢?我想这很多老鸟也不定说的清楚吧,前端杂而活跃的各种社区,很多前端er一度依赖各种插件,根本不需要去了解这些深层的东西却照样能完成任务。但我想作为一个有追求的前端er还是很有必要去学习这些看似用不着的东西的,别的不说,就单单因为我们是前端er,只会用jquery一个稍微厉害的后端都能代替你。好吧,废话不多说,到底如何面向对象coding呢…..

很不幸,es5中并没有给出明确的定义‘类’的概念,所以传统的面向对象编程似乎是行不通的,那么又该肿么办呢?值得庆幸的是,前辈们通过不断探索总结,成功的用javascript模拟出了“类”。那么,javascript的类又该怎么定义呢?

在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对象(又称”实例”)共有的属性和方法。

JavaScript 中对象的深拷贝

蓝蓝设计的小编

在JavaScript中,对对象进行拷贝的场景比较常见。但是简单的复制语句只能对对象进行浅拷贝,即复制的是一份引用,而不是它所引用的对象。而更多的时候,我们希望对对象进行深拷贝,避免原始对象被无意修改。

对象的深拷贝与浅拷贝的区别如下:

  • 浅拷贝:仅仅复制对象的引用,而不是对象本身;
  • 深拷贝:把复制的对象所引用的全部对象都复制一遍。

一. 浅拷贝的实现

浅拷贝的实现方法比较简单,只要使用是简单的复制语句即可。

1.1 方法一:简单的复制语句

/* ================ 浅拷贝 ================ */ function simpleClone(initalObj) { var obj = {}; for ( var i in initalObj) {
        obj[i] = initalObj[i];
    } return obj;
}

JavaScript世界万物诞生记

蓝蓝设计的小编

一. 无中生有

起初,什么都没有。

1.png

 

造物主说:没有东西本身也是一种东西啊,于是就有了null:

现在我们要造点儿东西出来。但是没有原料怎么办?

有一个声音说:不是有null嘛?

另一个声音说:可是null代表无啊。

造物主说:那就无中生有吧!

于是:

2.png

更快学习JS的6个简单思维技巧

蓝蓝设计的小编

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战:

  • 有些概念容易混淆,特别是当你学习过其他语言的时候。
  • 很难找到学习的时间(有时候是动力)。
  • 一旦当你理解了一些东西的时候,却很容易再一次忘记。
  • 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手。

幸运的是,这些挑战最终都可以被战胜。在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员。

对于很多学习 JavaScript 的人来说,他们问的第一个问题是选用哪个框架(现有框架非常多)。但是如果你还不熟悉原生的 JavaScript ,那这就是个不该问的问题。你会花费你全部的时间去查询不同的框架并且不会取得任何进展。

2016年7个JavaScript框架

蓝蓝设计的小编

当涉及到Web开发时,JavaScript框架往往是一些开发人员和企业的平台。可能,你有机会尝试过一两个的JavaScript框架,但你仍然有点不确定哪个才是最佳的最值得掌握的,或者哪个值得你建议你的开发人员选择用于下一个web开发项目。

JavaScript正在以惊人的速度前进,并且添加新的技能到你的存储库变得有不断的压力。为了做到这一点,知道和了解更多的JavaScript框架在现在看来是必要的。在ValueCoders进行了彻底的研究后,我们入围了其中七个框架,它们是:

1.AngularJS 2.0&1.x

在最受期待的AngularJS 2.0正式发布之后,框架的普及已经达到了一个新的水平。然而,如果你不确定的话,跳到新版本仍然是一个冒险的决定。让我们通过这个流程图来帮助你做出决定:

1.png

JavaScript 数组中的 indexOf 方法详解

蓝蓝设计的小编

最近项目遇到一个小问题代码我会简化成小例子展示给大家。

用心看到最后会有收获哈,基础扎实的童鞋可以直接跳到数组类型使用

说到 indexOf 大家并不陌生,判断字符串是否包涵子字符串时特别常用(正则不熟练同学的利器)。

String 类型的使用

温习一下大家熟知的字符串用法,举个例子

let str = 'orange';

str.indexOf('o'); //0 str.indexOf('n'); //3 str.indexOf('c'); //-1

这里 0 和 3 分别是 o 和 n 在字符串中出现的位置。起始下标是 0。而 -1 代表未匹配。

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档