`
varsoft
  • 浏览: 2436525 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JavaScript函数 this调用规则

阅读更多

21世纪开运网www.21kaiyun.com源码中大量使用了this这个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函数的调用以及参数传递

    JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同方式在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 Note 注意 this 是保留关键字,你不能...

    JavaScript 函数调用规则

    JavaScript函数调用规则一 (1)全局函数调用: function makeArray( arg1, arg2 ){ return [this , arg1 , arg2 ]; } 这是一个最常用的定义函数方式。相信学习JavaScript的人对它的调用并不陌生。 调用代码如下: ...

    JavaScript this调用规则说明

    JavaScript函数调用规则一 (1)全局函数调用: 代码如下: function makeArray( arg1, arg2 ){ return [this , arg1 , arg2 ]; } 这是一个最常用的定义函数方式。相信学习JavaScript的人对它的调用并不陌生。 调用代码...

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

    在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用。函数有四种调用模式,分别是:函数调用形式、方法调用形式、构造器形式、以及apply形式...

    JavaScript 函数调用

    JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 注意 this 是保留关键字,你不能修改...

    javascript 函数限制调用代码

    函数: 代码如下: function throttle(fn,ms) { ... } 参数 fn : 传入的函数/方法 参数 ms:每次函数调用时的间隔(毫秒为单位),如输入2000,函数在2秒内不会重复触发。 附一初始化例子 代码如下: document.getElementById

    Javascript 函数的四种调用模式

    Javascript 函数的四种调用模式 1 函数模式  最普通的函数调用 // 声明式函数 function fn1 () { console.log(this); } // 函数表达式函数 var fn2 = function() { console.log(this); }; // 调用 函数中this...

    javascript函数的解释

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

    javascript函数的四种调用模式

    下面的调用模式就是大家最熟悉的函数调用模式,而函数调用模式的this指向和返回值是什么呢? function fn1 () { console.log(this); }; fn1(); // 在调用函数fn1时,输出的this的结果是Window 在上述代码中,fn1也...

    浅析JavaScript函数的调用模式

    我们说一个函数的调用模式是作为一个函数来调用,是要与其它三种调用模式做区分 函数其他的三种调用: 方法调用模式,构造器调用模式,apply/call调用模式。  方法的调用模式:  var obj={ fun1: function(){ //...

    javascript 中 this 的用法.docx

    通常来说,this 的值是在函数被调用时确定的,其值取决于函数被调用的方 式。本文将介绍 JavaScript 中 this 的用法,从而帮助开发者更好地理解并掌握 this 的使用。 一、在全局作用域中使用 this 在全局作用域中...

    javascript 函数调用的对象和方法

    如果你真正理解Javascript函数是如何调用工作的,那么就可以避免一些bug的发生; 首先让我们创建一个简单的函数,这个函数将在下文中使用,这个函数仅仅返回当前的this的值和两个提供的参数. 代码如下: function make...

    JavaScript函数的4种调用方法实例分析

    本文实例讲述了JavaScript函数的4种调用方法。分享给大家供大家参考,具体如下: JavaScript 函数有 4 种调用方式: 1. 作为一个函数调用 2. 函数作为方法调用 3. 使用构造函数调用函数 4. 作为函数方法调用函数...

    JavaScript直接调用函数与call调用的区别实例分析

    本文实例讲述了JavaScript直接调用函数与call调用的区别。分享给大家供大家参考,具体如下: 直接调用 直接调用函数是最常见 最普通的方式,直接以函数附加的对象作为调用者, 在函数后括号内传入参数来调用函数 例如:...

    JavaScript 函数的定义-调用、注意事项

    函数定义 函数语句定义 function(a,b){ return a+b; } 表达式定义 var add = function(a,b){return a+b};...//函数表达式可以包含名称,这在递归时很有用 var f = function fact(x){ if...1.like_this()第一个字符为小

    Javascript this 函数深入详解

     本文对Javascript this函数进行详细介绍,及知识的总结整理,彻底明白js this 函数该如何使用。 this 代码函数调用时, .1直接调用函数则为this则指向window对象 .2类调用时候指向这个类 .3 方法.apply(obg) ;...

    深入理解JavaScript系列

    深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP 深入理解JavaScript系列(7):S.O.L.I.D...

    JavaScript的级联函数用法简单示例【链式调用】

    级联函数就是在对象调用中通过点的方式串联调用,在jQuery中就是链式调用, 其关键点就是在内部 return this 返回自身 应用 function Person() { this.name = ''; this.age = 0; this.weight = 10; } Person....

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

    JavaScript调用时除了声明时定义的形参外,每个函数接受两个附加参数:this 和arguments,this在面向对象编程中非常重要,它取决于调用模式。 JavaScript有四种调用模式,方法调用模式,函数调用模式,构造器调用...

Global site tag (gtag.js) - Google Analytics