注:这篇文章原文:http://www.jb51.net/article/30883.htm

  自己作为学习,重新写写。

  一、写在前面的话

  前端javascript编程还只是略懂皮毛,DOM知道一点,jquey会用一点点,深知夯实基础,了解前端的系统的知识对于web开发(自己主要做的是PHP后台的开发)的重要。固然,要用什么,就查什么(现学现卖)很合理,但对于长远来讲,只是在隔靴捎痒,很难有实际的作为。

  故,痛定思痛,应该对web前端,尤其是 javascript开发(过程式-->面向对象-->各种javascript库、jquery,即javascript框架、Anjular)这些东西都应该有一些全面系统、慢慢深入的了解。只有全面系统了解了,深入进去了,才不会老是临时才报佛脚,才能自己主动去发现问题,自己主动去提高,开拓眼界。

  二、javascript 的Function对象

官方API 文档(IE microsoft):https://msdn.microsoft.com/zh-cn/library/x844tc74(v=vs.94).aspx

由于Function对象的属性和方法,我们自定义的函数都会自动有这些属性和方法,具体用的时候查看API,IE、FireFox、Chrome可能不同。

主要讲讲apply(),call():

1、apply(),call()用途相同,都是在特定的作用域中调用函数。++call和apply方法通常被用来实现类似继承一样的功能,以达到代码复用的功效。它们的区别主要体现在参数上。

2、接受参数方面,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。

例1:

window.firstName = "diz";
window.lastName = "song";
var myObject = { firstName: "my", lastName: "Object" };
function HelloName() {
  console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!");
}
HelloName.call(window); //huo .call(this);
HelloName.call(myObject);

  运行结果为:
Hello diz song glad to meet you!
Hello my Object glad to meet
you!

例2:带参数

function sum(num1, num2) {
return num1 + num2;
}
console.log(sum.call(window, 10, 10)); //20
console.log(sum.apply(window,[10,20])); //30

  分析:通过例1发现,apply()和call()的真正用武之地是能够扩充函数赖以生存的作用域,如果我们想要用传统的方法实现,代码如下:

window.firstName = "diz";
window.lastName = "song";
var myObject = { firstName: "my", lastName: "Object" };
function HelloName() {
console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!");
}
HelloName(); //Hello diz song glad to meet you!
myObject.HelloName = HelloName;
myObject.HelloName(); //Hello my Object glad to meet you!

  我们发现,要想让HelloName()函数的作用域在对象myObject上,我们需要动态的创建 myObject的 HelloName属性,此属性作为 指针 指向 HelloName()函数,这样,我们调用 myObject.HelloName()时,函数内部的this变量就指向 myObject,也就可以调用该对象内部的其他公共属性了。

  分析例2,我们可以看到call()和apply()函数的真正运用之处,在实际项目中,还需要根据实际灵活加以处理!
  一个小问题:再看一看函数中定义函数时,this变量的情况 :

function temp1() {
console.log(this); //Object {}
function temp2() {
console.log(this); //Window
}
temp2();
}
var Obj = {};
temp1.call(Obj); //运行结果见上面绿色的注释!!!!

  执行结果与下面的相同

function temp1() {
console.log(this);
temp2();
}
function temp2() {
console.log(this);
}
var Obj = {};
temp1.call(Obj);

例3:

再看一个例子:

//定义一个Animal类
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
/**定义一个Cat类*/
function Cat(){
this.name = "Cat";
} /**创建两个类对象*/
var animal = new Animal();
var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。
//输入结果为"Cat"
animal.showName.call(cat,",");
//animal.showName.apply(cat,[]);

    

3、bind()方法

支持此方法的浏览器有IE9+、Firefox4+、Safari5.1+、Opera12+、Chrome。它是属于ECMAScript5的方法。直接看例子:

window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var OSayColor = sayColor.bind(o);
OSayColor(); //blue

  这里,sayColor()调用bind()方法,并传入o对象,返回了OSayColor()函数,在OSayColor()中,this的值就为o对象。 

javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性的更多相关文章

  1. 函数的apply、call方法和length属性

    函数的apply.call方法和length属性JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:Fu ...

  2. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  3. JavaScript中的call()、apply()与bind():

    关于call()与apply(): 在JavaScript中,每个函数都有call与apply(),这两个函数都是用来改变函数体内this的指向,并调用相关的参数. 看一个例子: 定义一个animal ...

  4. JavaScript中的call、apply、bind方法的区别

    在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...

  5. 简单模拟实现javascript中的call、apply、bind方法

    目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的 ...

  6. JavaScript的function对象

    我必须先说Java与JavaScript没有关系,不是我以前想的那个样子的(JavaScript是Java的一种超进化) 在JavaScript中,函数(function)就是对象. JavaScri ...

  7. Javascript脚本 :Function 对象的定义和使用

    javascript  Function 对象的定义 创建函数的语法:var myFunction=new Function(arg1,arg2,...agrN,body);agrN 为函数的参数,b ...

  8. JavaScript中的call、apply、bind是怎么回事?

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  9. jQuery中bind方法和live方法区别解析

    Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个.在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡 ...

随机推荐

  1. nmon 安装

    安装: mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_li ...

  2. 二〇一五年五月二十二日--bug--启动页面出现模糊的问题

    启动页面出现模糊的问题: 原因是 :android:theme="@style/TranslucentTheme" <application android:name=&qu ...

  3. python2.7学习记录之三

    1.连接数据库 MySQLdb的是一个接口连接到MySQL数据库服务器从Python.它实现了Python数据库API V2.0,并建上的MySQL C API的顶端. 下载地址:https://so ...

  4. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...

  5. 使用AOP 使C#代码更清晰

    简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加"切面"可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现 ...

  6. svn revert

    本地开发环境出现一个问题,用revert完美解决. 问题描述: 文件static/image/common/jiqiaodaren.png已经被提交到svn上,但是我的开发环境因未与svn同步,所以没 ...

  7. Spring Security3实现,权限动态获取

    Spring Security3实现,权限动态获取 原文  http://blog.csdn.net/yangwei19680827/article/details/9359113 主题 网络安全Sp ...

  8. 关于PHP执行超时的问题

    PHP配置文件的参数max_execution_time表示脚本执行超时时间 max_execution_time=0表示不限制 max_execution_time=2表示执行两秒后终止,同时报错F ...

  9. inno setup 1

      1.简单脚本 [setup] AppName=Test AppVerName=Test DefaultDirName="d:\setup\app" AppVersion=1.0 ...

  10. 关于WIFI DIRECT功能的

    http://processors.wiki.ti.com/index.php/WiFi_Direct_Configuration_Scripts#p2p_find      https://wire ...