JavaScript完美调用函数的5种方法

来源:程序思维浏览:2698次
本文详细介绍了javascript中各种函数调用的方法和原理,这对理解JavaScript的功能非常有帮助!

JavaScript完美调用函数的5种方法

JavaScript,5种调用函数的方法

一次又一次,我发现带有错误的Javascript代码是由于没有真正理解Javascript函数如何工作(顺便说一下,许多代码是由我编写的)引起的。 JavaScript具有函数式编程的功能。当我们选择面对它时,这将阻碍我们的进步。

作为初学者,让我们测试五个函数调用的方法。从表面上看,我们认为这些函数与C#中的函数非常相似,但是我们可以看到未来仍然存在非常重要的差异,忽略这些差异无疑会导致难以跟踪的错误。首先让我们创建一个稍后将使用的简单函数。此函数只返回this的当前值和两个提供的参数。

<script type="text/javascript">
function makeArray(arg1, arg2){
    return [ this, arg1, arg2 ];
}
</script>

最常见的方法,但不幸的是,全局函数调用,当我们学习Javascript时,我们学习了如何使用上面示例中的语法定义函数。

我们也知道调用这个函数非常简单,我们需要做的就是:

makeArray("one", "two");
// => [ window, "one", "two" ]
Wait a minute. What"s that window
alert( typeof window.methodThatDoesntExist );
// => undefined
alert( typeof window.makeArray);
// =>
window.makeArray("one", "two");
// => [ window, "one", "two" ]

我说最常见的调用方法是不幸的,因为它导致我们声明的函数默认是全局的。我们都知道,全球成员并没有编写最佳实践。在JavaScript中尤其如此,避免在JavaScript中使用全局成员,是没错的。

JavaScript函数调用规则1

在没有显式所有者对象的情况下直接调用的函数(例如myFunction())将导致此值成为默认对象(浏览器中的窗口)。

函数调用

现在让我们创建一个简单的对象,使用makeArray函数作为它的一个方法,我们将使用json声明一个对象,我们也调用这个方法:

//creating the object
var arrayMaker = {
    someProperty: "some value here",
    make: makeArray
};
//invoke the make() method
arrayMaker.make("one", "two");
// => [ arrayMaker, "one", "two" ]
// alternative syntax, using square brackets
arrayMaker["make"]("one", "two");
// => [ arrayMaker, "one", "two" ]

看到这里的差异,它的价值就变成了对象本身。您可能想知道原始函数定义是否未更改,为什么它不是窗口?好吧,这是函数在JSavacript中传递的方式,函数In JavaScript是一种标准数据类型,特别是一个对象。您可以传递或复制它们。就好像使用参数和函数列表复制整个函数,并将其分配给arrayMaker中的属性make。这就像定义一个这样的arrayMaker:

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

JavaScript函数调用规则2

在方法调用语法中,如obj.myFunction()或obj"myFunction",则this的值为obj。

这是事件处理代码中的主要错误来源。看看这些例子。

<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>

单击第一个按钮将显示“btn”,因为它是一个方法调用,这是它所属的对象(按钮元素)。单击第二个按钮将显示“window”,因为buttonClicked是直接调用的(与obj.buttonClicked()不同。)这和我们的第三个按钮,事件处理程序直接放在标签中。因此,单击第三个按钮的结果与第二个按钮相同。

使用像jQuery这样的JS库的优点是,当在jQuery中定义事件处理程序时,JS库将帮助覆盖它的值,以确保它包含对当前事件源元素的引用。

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

jQuery如何重载这个值呢?

另外两个:apply()和call()

您使用JavaScript函数的次数越多,您发现需要传递函数并在不同的上下文中调用它们的次数就越多,就像Qjuery在事件处理程序中所做的那样,您经常需要重置它的值。记住我告诉你的,在Javascript函数中也是对象,函数对象包含一些预定义的方法,其中两个是apply()和call(),我们可以用它来重置它。

var gasGuzzler = { year: 2008, model: "Dodge Bailout" };
makeArray.apply( gasGuzzler, [ "one", "two" ] );
// => [ gasGuzzler, "one" , "two" ]
makeArray.call( gasGuzzler,  "one", "two" );
// => [ gasGuzzler, "one" , "two" ]

这两种方法是相似的。不同之处在于以下参数不同。 Function.apply()使用数组传递给函数,Function.call()独立传递。在实践中,您会发现在大多数情况下apply()更方便。

JSavacript函数调用规则3

如果我们想要在不将函数复制到方法的情况下覆盖它的值,我们可以使用myFunction.apply(obj)或myFunction.call(obj)。

构造函数

我不想深入研究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" ]

一个非常重要且值得注意的是在函数调用之前出现的新运算符。没有它,你的函数就像一个全局函数,我们创建的属性将在全局对象(窗口)上创建,你不想要那个,另一个主题是,因为你的构造函数中没有返回值,所以如果您忘记使用new运算符,则会导致您的某些变量未定义。因此,构造函数是大写的。开始是一个好习惯,这可以作为一个提醒,让你不要忘记以前的新操作员打电话。如此小心,初始化函数中的代码类似于您在其他语言中编写的初始化函数。这个值将是您要创建的对象。

JSavacript函数调用规则4

当您使用函数作为初始化函数(如MyFunction())时,Javascript运行时将指定此值作为新创建的对象。

我希望了解调用各种函数的不同方法可以使您的Sjavacript代码远离错误。其中一些错误将确保您始终知道这是避免它们的第一步。
精品好课
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
收藏
扫一扫关注我们