5种调用函数的方法
本文详细介绍了各种函数调用的方法和原理,对于理解函数很有帮助!
、5种调用函数的方式
一次又一次,我发现有错误的代码是由于没有真正理解函数如何工作而导致的(顺便说一句,我写了很多这样的代码)。 具备了函数式编程的特点,当我们选择面对它的时候,它就会成为我们前进的障碍。
作为初学者,我们来测试一下函数调用的五种方法。 从表面上看,我们会认为这些函数与 C# 中的函数非常相似,但稍后我们会发现它们仍然非常重要。 在不同的地方,忽略这些差异无疑会导致难以追踪的bug。 首先,让我们创建一个简单的函数,下面将使用它。 该函数仅返回 this 和两个提供的参数的当前值。
复制代码代码如下:
最常见但不幸的是全局函数调用
在学习过程中,我们学习如何使用上例中的语法来定义函数。
,我们也知道调用这个函数非常简单,我们需要做的就是:
复制代码代码如下:
活跃英语('一', '二');
// => [, '一', '二']
等等。 那是什么
警报( );
/ =>
警报( 。);
// =>
。('一二');
// => [, '一', '二']
我说最常见的调用方法是不幸的,因为它导致我们声明的函数默认是全局的。 我们都知道全局成员并不是编程的最佳实践。 在这里尤其如此,避免在全局成员中使用它们,你不会后悔的。
函数调用规则1
在没有明确所有者对象的情况下直接调用的函数中,例如 (),this 的值将导致 this 的值成为默认对象(浏览器中的窗口)。
函数调用
现在让我们使用函数作为其方法之一来创建一个简单的对象。 我们将使用 json 来声明一个对象。 我们也将调用这个方法。
复制代码代码如下:
// 这
变量 = {
ty: '这里有一些价值',
:
};
// 制作()
.make('一', '二');
// => [, '一', '二']
// , 使用
['制作']('一', '二');
// => [, '一', '二']
看看这里的区别,this 的值变成了对象本身。 你可能想知道为什么原来的函数定义没有改变。 嗯,函数是这样传入的,函数内部就是一个标准的数据类型,准确的说是一个对象。 您可以传递它们或复制它们。 这就像整个函数连同参数列表和函数体被复制并分配给 make 内部的属性,然后就像定义这样一个函数:
复制代码代码如下:
变量 = {
: '这里有一些价值',
使:(arg1,arg2){
[这个,arg1,arg2];
得到 }
};
函数调用规则2
在方法调用语法中,例如 () 或 obj[''](),this 的值为 obj
这是事件处理代码中错误的主要来源,请查看这些示例
复制代码代码如下:
点击第一个按钮会显示“btn”,因为这是一个方法调用,而这就是它所属的对象(按钮元素)。 点击第二个按钮会显示“”,因为它是直接调用的(不是像obj.().)。这和我们的第三个按钮一样,将事件处理函数直接放在标签中。 所以点击第三个按钮的结果和第二个按钮是一样的。
使用像 JS 这样的 JS 库的优点是,当在那里定义事件处理函数时,JS 库将帮助重写 this 的值,以确保它包含对当前事件源元素的引用。
复制代码代码如下:
//使用
$('#btn1').click( () {
警报(这个.id); // 'this' 将是
});
如何超载这个值? 继续阅读
另外两个:apply() 和 call()
使用函数越多,您就越发现需要传递函数并在不同的上下文中调用它们,就像在事件处理程序中所做的那样,并且经常需要重置 this 的值。 记住我告诉过你的,函数也是 . 函数对象包含一些预定义的方法,其中两个是 apply() 和 call()。 我们可以使用它们将其应用于重置。
复制代码代码如下:
var = { 年份:2008,型号:'道奇' };
.apply( , [ '一', '二' ] );
// => [, '一', '二']
.call( , '一', '二' );
lxy
// => [, '一', '二']
这两种方法类似,除了以下参数之外。 .apply() 使用数组传递给函数,而 .call() 独立传递这些参数。 在实践中,你会发现apply()在大多数情况下更加方便。
函数调用规则3
如果我们想覆盖 this 的值而不将函数复制到方法,我们可以使用 .apply( obj ) 或 .call( obj )。
构造函数
我不想深入研究 中类型的定义,但此时我们需要知道 中没有类,并且任何
自定义类型需要初始化函数。 使用原型对象(作为初始化函数的属性)来定义类型也是一个好主意。 让我们创建一个简单的类型
复制代码代码如下: