`
linychuo
  • 浏览: 8862 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JavaScript函数调用的四个规则

阅读更多

JavaScript函数调用规则一

(1)全局函数调用:

function makeArray( arg1, arg2 ){ 
return [this , arg1 , arg2 ]; 
}

这是一个最常用的定义函数方式。相信学习JavaScript的人对它的调用并不陌生。
调用代码如下:
makeArray('one', 'two'); 
// =﹥ [ window, 'one', 'two' ] 

这种方式可以说是全局的函数调用。
为什么说是全局的函数?
因为它是全局对象window 的一个方法,
我们可以用如下方法验证:
alert( typeof window.methodThatDoesntExist ); 
// =﹥ undefined 
alert( typeof window.makeArray); 
// =﹥ function  

所以我们之前调用 makeArray的方法是和下面调用的方法一样的
window.makeArray('one', 'two'); 
// =﹥ [ window, 'one', 'two' ] 

JavaScript函数调用规则二

(1)对象方法调用:

//creating the object 
var arrayMaker = { 
someProperty: 'some value here', 
make: makeArray 
}; 

arrayMaker.make('one', 'two');     // =﹥ [ arrayMaker, 'one', 'two' ] //或者用下面的方法调用: arrayMaker['make']('one', 'two');  // =﹥ [ arrayMaker, 'one', 'two' ]


看到这里跟刚才的区别了吧,this的值变成了对象本身.
你可能会质疑:为什么原始的函数定义并没有改变,而this却变化了呢?

非常好,有质疑是正确的。这里涉及到 函数在JavaScript中传递的方式, 
函数在JavaScript 里是一个标准的数据类型,
确切的说是一个对象.你可以传递它们或者复制他们.
就好像整个函数连带参数列表和函数体都被复制,
且被分配给了 arrayMaker 里的属性 make,那就好像这样定义一个 arrayMaker :

var arrayMaker = { 
someProperty: 'some value here', 
make: function (arg1, arg2) { 
return [ this, arg1, arg2 ]; 
} 
};  

如果不把调用规则二 弄明白,那么在事件处理代码中 经常会遇到各种各样的bug,举个例子:
﹤input type="button" value="Button 1" id="btn1"  /﹥ 
﹤input type="button" value="Button 2" id="btn2"  /﹥ 
﹤input type="button" value="Button 3" id="btn3"  onclick="buttonClicked();"/﹥ 
﹤ script type="text/javascript"﹥ 
function buttonClicked(){ 
var text = (this === window) ? 'window' : this.id; 
alert( text ); 
} 
var button1 = document.getElementById('btn1'); 
var button2 = document.getElementById('btn2'); 
button1.onclick = buttonClicked; 
button2.onclick = function(){    
buttonClicked();    
}; 
﹤ /script﹥   

点击第一个按钮将会显示”btn1”,因为它是一个方法调用,this为所属的对象(按钮元素) 。
点击第二个按钮将显示”window”,因为 buttonClicked 是被直接调用的( 不像 obj.buttonClicked() ),
这和第三个按钮,将事件处理函数直接放在标签里是一样的.所以点击第三个按钮的结果是和第二个一样的。

所以请大家注意:

button1.onclick = buttonClicked; 
button2.onclick = function(){    
buttonClicked();    
}; 

this指向是有区别的。

JavaScript函数调用规则三

当然,如果使用的是jQuery库,那么你不必考虑这么多,它会帮助重写this的值以保证它包含了当前事件源元素的引用。

//使用jQuery 
$('#btn1').click( function() { 
alert( this.id ); // jQuery ensures 'this' will be the button 
}); 

那么 jQuery是如何重载this的值的呢?
答案是: call()和apply();

当函数使用的越来越多时,你会发现你需要的this 并不在相同的上下文里,这样导致通讯起来异常困难。

在Javascript中函数也是对象,函数对象包含一些预定义的方法,其中有两个便是apply()和call(),我们可以使用它们来对this进行上下文重置。

﹤input type="button" value="Button 1" id="btn1"  /﹥ ﹤input type="button" value="Button 2" id="btn2"  /﹥ ﹤input type="button" value="Button 3" id="btn3"  onclick="buttonClicked();"/﹥ ﹤ script type="text/javascript"﹥ function buttonClicked(){ var text = (this === window) ? 'window' : this.id; alert( text ); } var button1 = document.getElementById('btn1'); var button2 = document.getElementById('btn2'); button1.onclick = buttonClicked; button2.onclick = function(){    buttonClicked.call(this);  // btn2 }; ﹤ /script﹥

JavaScript函数调用规则四

(1)构造器
我不想深入研究在Javascript中类型的定义,但是在此刻我们需要知道在Javascript中没有类,
而且任何一个自定义的类型需要一个初始化函数,使用原型对象(作为初始化函数的一个属性)定义你的类型也是一个不错的想法,
让我们来创建一个简单的类型

//声明一个构造器 function ArrayMaker(arg1, arg2) { this.someProperty = 'whatever'; this.theArray = [ this, arg1, arg2 ]; } // 声明实例化方法 ArrayMaker.prototype = { someMethod: function () { alert( 'someMethod called'); }, getArray: function () { return this.theArray; } };

var am = new ArrayMaker( 'one', 'two' ); var other = new ArrayMaker( 'first', 'second' ); am.getArray(); // =﹥ [ am, 'one' , 'two' ] other.getArray(); // =﹥ [ other, 'first', 'second'  ]


一个非常重要并值得注意的是出现在函数调用前面的new运算符,没有那个,你的函数就像全局函数一样,且我们创建的那些属性都将是创建在全局对象上(window),而你并不想那样。
另外一点,因为在你的构造器里没有返回值,所以如果你忘记使用new运算符,将导致你的一些变量被赋值为 undefined。

所以构造器函数以大写字母开头是一个好的习惯,这可以作为一个提醒,让你在调用的时候不要忘记前面的new运算符.

这样 初始化函数里的代码和你在其他语言里写的初始化函数是相似的.this的值将是你将创建的对象.

总结

我希望通过这些来使你们理解各种函数调用方式的不同,让你的JavaScript代码远离bugs。知道this的值是你避免bugs的第一步。

分享到:
评论

相关推荐

    JavaScript函数的4种调用方法详解

    函数有四种调用模式,分别是:函数调用形式、方法调用形式、构造器形式、以及apply形式。这里所有的调用模式中,最主要的区别在于关键字 this 的意义,下面分别介绍这个几种调用形式。 本文主要内容: 1.分析函数的...

    Javascript 函数的四种调用模式

     最普通的函数调用 // 声明式函数 function fn1 () { console.log(this); } // 函数表达式函数 var fn2 = function() { console.log(this); }; // 调用 函数中this表示全局对象,在浏览器中就是指window fn1();...

    javascript函数的解释

    javascript函数的解释,解释了具体函数的功能,一、函数JavaScript函数集合 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:...

    javascript函数

    函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值。当一个函数在一个对象上被调用的时候,这个函数就叫做方法(method),它的调用所在的对象就会作为函数的一个隐式的参数来传递。读者可能...

    函数式JavaScript编程指南

    简介 你是否知道JavaScript其实也是一个函数式编程语言呢?本指南将教你如何利用JavaScript的函数式特性。... 第一课 —— 匿名函数 第二课 – 函数作为值 第三课 – 两种方式调用函数 第四课 – 

    JavaScript四种调用模式和this示例介绍

    JavaScript有四种调用模式,方法调用模式,函数调用模式,构造器调用模式和apply调用模式。这些模式在初始化关键参数this上存在差异。 方法调用模式:当一个函数被保存为对象的一个属性时,我们称它为一个方法,当...

    javascript 具名函数的四种调用方式 推荐第1/3页

    1、()小括号运算符 平时最常用的就是()运算符来调用一个函数 代码如下://无参函数fun1 function fun1() { alert(‘我被调用了’); } fun1() //有参函数fun2 function fun2(param) { alert(param); }...

    JavaScript中this的四个绑定规则总结

    所以这篇文章开始将介绍javascript中this的四个绑定规则,下面来一起看看吧。 绑定规则 1. 默认绑定 独立函数调用时,this 指向全局对象,如果使用严格模式,那么全局对象无法使用默认绑定, this绑定至 undefined...

    Javascript this 函数深入详解

    this 代码函数调用时, .1直接调用函数则为this则指向window对象 .2类调用时候指向这个类 .3 方法.apply(obg) ;此时这个方法内部的this指向 obj 不传参数 则指向window .4 function 作为构造函数时, 内部this 指向...

    JavaScript函数中的this四种绑定形式

     javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this 一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最核心的一点——函数中的this总指向调用它的...

    JavaScript 权威指南(第四版).pdf

     8.2 函数调用168  8.3 函数的实参和形参173  8.4 作为值的函数178  8.5 作为命名空间的函数181  8.6 闭包182  8.7 函数属性、方法和构造函数188  8.8 函数式编程194  第9章 类和模块201  9.1 类和原型202 ...

    JavaScript权威指南(第6版)

    8.2 函数调用 8.3 函数的实参和形参 8.4 作为值的函数 8.5 作为命名空间的函数 8.6 闭包 8.7 函数属性、方法和构造函数 8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类...

    使用 JavaScript 创建和分析 JSON 消息

    对于 Array 实例,会依次调用每个所包含元素的 toJSONString() 函数,结果会以逗号进行连接从而分隔每个结果。最终输出会包括在方括号内。同样,对于 Object 实例,会枚举每个成员,并调用其 toJSONString() 函数。...

    javascript学习笔记(四)function函数部分

    本文主要介绍了函数的调用方式、返回函数的函数、创建匿名函数、javascript创建动态函数、回调函数、方法和函数的区别、js全局函数、函数的几个作用、prototype属性、高阶函数,非常实用,有需要的参考下

    JavaScript王者归来part.1 总数2

     6.1.1.2 JavaScript函数的奥妙——魔法代码   6.1.2 函数的调用   6.2 函数的参数   6.2.1 形参与实参   6.2.2 Arguments对象   6.2.2.1 一个使用Arguments对象检测形参的例子   6.2.2.2 一个使用...

    JavaScript权威指南(第6版)(中文版)

    8.2 函数调用 8.3 函数的实参和形参 8.4 作为值的函数 8.5 作为命名空间的函数 8.6 闭包 8.7 函数属性、方法和构造函数 8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类...

    JavaScript权威指南(第6版)中文文字版

    8.2 函数调用 168 8.3 函数的实参和形参 173 8.4 作为值的函数 178 8.5 作为命名空间的函数 181 8.6 闭包 182 8.7 函数属性、方法和构造函数 188 8.8 函数式编程 194 第9章 类和模块 201 9.1 类和原型 202 9.2 类和...

    【javascript】函数中的this的四种绑定形式

    javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最核心的一点——函数中的this总指向调用它的对象...

Global site tag (gtag.js) - Google Analytics