您的当前位置:首页正文

Javascript调用函数方法的几种方式介绍_javascript技巧

2023-12-05 来源:帮我找美食网

javascript语法灵活,同一个功能有五六种实现方式并不罕见,然后再加上有些反人类的原型继承和异步特性,就更让人一头雾水了。我经常搞不清楚call,apply之间的区别,今天就记录一下,以免再忘了。

在javascript中,方法可以通过以下几种方式执行:

1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。

2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法中的入参一一对应。

3.func.bind(sth)(),mozilla手册中提到bind是在ECMA-262 5th Edition中新增的一个特性,这里单独列出来作为一种调用方式是因为它弥补了直接调用中不能绑定作用域的缺陷。

4.func.call(),这是第二种调用方式,每个方法的原型中都定义了call方法,用来执行当前方法。

5.func.apply(),call的双胞胎兄弟。

func()

这是最常见的调用方式,在任何语言中随处可见。func(x, y)可以传入不同的参数。在某些语言,例如php,java中,这种调用足以解决一切问题。但是javascript是一门函数式语言,闭包的概念和一个奇怪的关键词this决定了这种调用方式的不足。this应该可以解释为当前代码段的作用域,会随着代码执行到不同的片段而改变,但是某些情况下我们不希望这个this被改变,例如绑定在某些dom上的事件,我们肯定不希望他们被调用的时候this被转移到了window对象上,但有时候确实如此,再比如下面的代码。 代码如下:var a ={};var func = function(x) { console.log(this);};a.onclick = function() { var x = 100; func(x);};a.onclick();

可以把a想象成页面中的一个链接,由于我们只是想将定义好的方法绑定到onclick事件上,而不是立刻调用它,而且这个方法拥有一个参数,所以我们需要用一个匿名方法将他包起来传递给a的onclick事件。这样就有了一个问题,func中的this变成了全局对象window,显然我们并不希望如此。这个时候,使用func()这种直接调用的方式就不行了,于是我们需要将func外的this绑定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常简单,返回一个绑定了this对象的相同方法。上面的代码修改一行就可以实现绑定this在a对象上目的。 代码如下:var a ={};var func = function(x) { console.log(this);};a.onclick = function() { var x = 100; func.bind(this)(x); // bind here};a.onclick();

这样,onclick事件的this就不会像无头苍蝇一样到处乱跑啦。

call & apply

call和apply要放在一起讲,因为他们实在太像了。他们都支持多参数,而且第一个参数都是即将绑定的this对象,第二个参数则是他们的区别所在,call使用独立的参数作为调用方法的入参,apply使用一个数组作为入参。有的时候我们并不是不想改变this对象,而是想人为的将他绑定到别的对象上,这个时候call和apply是很好用的。(并不是说不能用bind,不过貌似bind出现的比较晚,可能浏览器兼容性不好)。举个栗子: 代码如下:a = { func: function() { this.x += 1; }, x: 0};b = { a: a, x: 20};for(var i = 0; i < 10; i++){ b.a.func();}console.log(a.x);console.log(b.x);

上面的a和b对象中都有x,我们希望func能针对性的修改对应的x,但是直接调用只可能修改func作用域中的x,也就是a.x。修改一下代码,就可以实现修改b.x目的 代码如下:a = { func: function() { this.x += 1; }, x: 0};b = { a: a, x: 20};for(var i = 0; i < 10; i++){ b.a.func.call(b); // bind this to b}console.log(a.x);console.log(b.x);

这个栗子举得不好,有点牵强附会,而且这是一种很容易让人迷惑的代码风格,有适用的场景,但不是处处都可用。

小编还为您整理了以下内容,可能对您也有帮助:

Javascript调用函数方法的几种方式介绍_javascript技巧


javascript语法灵活,同一个功能有五六种实现方式并不罕见,然后再加上有些*的原型继承和异步特性,就更让人一头雾水了。我经常搞不清楚call,apply之间的区别,今天就记录一下,以免再忘了。

在javascript中,方法可以通过以下几种方式执行:

1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。

2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法中的入参一一对应。

3.func.bind(sth)(),mozilla手册中提到bind是在ECMA-262 5th Edition中新增的一个特性,这里单独列出来作为一种调用方式是因为它弥补了直接调用中不能绑定作用域的缺陷。

4.func.call(),这是第二种调用方式,每个方法的原型中都定义了call方法,用来执行当前方法。

5.func.apply(),call的双胞胎兄弟。

func()

这是最常见的调用方式,在任何语言中随处可见。func(x, y)可以传入不同的参数。在某些语言,例如php,java中,这种调用足以解决一切问题。但是javascript是一门函数式语言,闭包的概念和一个奇怪的关键词this决定了这种调用方式的不足。this应该可以解释为当前代码段的作用域,会随着代码执行到不同的片段而改变,但是某些情况下我们不希望这个this被改变,例如绑定在某些dom上的事件,我们肯定不希望他们被调用的时候this被转移到了window对象上,但有时候确实如此,再比如下面的代码。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func(x);
};
a.onclick();


可以把a想象成页面中的一个链接,由于我们只是想将定义好的方法绑定到onclick事件上,而不是立刻调用它,而且这个方法拥有一个参数,所以我们需要用一个匿名方法将他包起来传递给a的onclick事件。这样就有了一个问题,func中的this变成了全局对象window,显然我们并不希望如此。这个时候,使用func()这种直接调用的方式就不行了,于是我们需要将func外的this绑定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常简单,返回一个绑定了this对象的相同方法。上面的代码修改一行就可以实现绑定this在a对象上目的。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func.bind(this)(x); // bind here
};
a.onclick();


这样,onclick事件的this就不会像无头苍蝇一样到处乱跑啦。

call & apply

call和apply要放在一起讲,因为他们实在太像了。他们都支持多参数,而且第一个参数都是即将绑定的this对象,第二个参数则是他们的区别所在,call使用独立的参数作为调用方法的入参,apply使用一个数组作为入参。有的时候我们并不是不想改变this对象,而是想人为的将他绑定到别的对象上,这个时候call和apply是很好用的。(并不是说不能用bind,不过貌似bind出现的比较晚,可能浏览器兼容性不好)。举个栗子:
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func();
}
console.log(a.x);
console.log(b.x);


上面的a和b对象中都有x,我们希望func能针对性的修改对应的x,但是直接调用只可能修改func作用域中的x,也就是a.x。修改一下代码,就可以实现修改b.x目的
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func.call(b); // bind this to b
}
console.log(a.x);
console.log(b.x);


这个栗子举得不好,有点牵强附会,而且这是一种很容易让人迷惑的代码风格,有适用的场景,但不是处处都可用。

Javascript调用函数方法的几种方式介绍_javascript技巧


javascript语法灵活,同一个功能有五六种实现方式并不罕见,然后再加上有些*的原型继承和异步特性,就更让人一头雾水了。我经常搞不清楚call,apply之间的区别,今天就记录一下,以免再忘了。

在javascript中,方法可以通过以下几种方式执行:

1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。

2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法中的入参一一对应。

3.func.bind(sth)(),mozilla手册中提到bind是在ECMA-262 5th Edition中新增的一个特性,这里单独列出来作为一种调用方式是因为它弥补了直接调用中不能绑定作用域的缺陷。

4.func.call(),这是第二种调用方式,每个方法的原型中都定义了call方法,用来执行当前方法。

5.func.apply(),call的双胞胎兄弟。

func()

这是最常见的调用方式,在任何语言中随处可见。func(x, y)可以传入不同的参数。在某些语言,例如php,java中,这种调用足以解决一切问题。但是javascript是一门函数式语言,闭包的概念和一个奇怪的关键词this决定了这种调用方式的不足。this应该可以解释为当前代码段的作用域,会随着代码执行到不同的片段而改变,但是某些情况下我们不希望这个this被改变,例如绑定在某些dom上的事件,我们肯定不希望他们被调用的时候this被转移到了window对象上,但有时候确实如此,再比如下面的代码。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func(x);
};
a.onclick();


可以把a想象成页面中的一个链接,由于我们只是想将定义好的方法绑定到onclick事件上,而不是立刻调用它,而且这个方法拥有一个参数,所以我们需要用一个匿名方法将他包起来传递给a的onclick事件。这样就有了一个问题,func中的this变成了全局对象window,显然我们并不希望如此。这个时候,使用func()这种直接调用的方式就不行了,于是我们需要将func外的this绑定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常简单,返回一个绑定了this对象的相同方法。上面的代码修改一行就可以实现绑定this在a对象上目的。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func.bind(this)(x); // bind here
};
a.onclick();


这样,onclick事件的this就不会像无头苍蝇一样到处乱跑啦。

call & apply

call和apply要放在一起讲,因为他们实在太像了。他们都支持多参数,而且第一个参数都是即将绑定的this对象,第二个参数则是他们的区别所在,call使用独立的参数作为调用方法的入参,apply使用一个数组作为入参。有的时候我们并不是不想改变this对象,而是想人为的将他绑定到别的对象上,这个时候call和apply是很好用的。(并不是说不能用bind,不过貌似bind出现的比较晚,可能浏览器兼容性不好)。举个栗子:
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func();
}
console.log(a.x);
console.log(b.x);


上面的a和b对象中都有x,我们希望func能针对性的修改对应的x,但是直接调用只可能修改func作用域中的x,也就是a.x。修改一下代码,就可以实现修改b.x目的
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func.call(b); // bind this to b
}
console.log(a.x);
console.log(b.x);


这个栗子举得不好,有点牵强附会,而且这是一种很容易让人迷惑的代码风格,有适用的场景,但不是处处都可用。

JS中this指向的几种函数调用方法的介绍

本篇文章给大家带来的内容是关于JS中this指向的几种函数调用方法的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

初学javascript总会对this指向感到疑惑,想要深入学习javascript,必须先理清楚和this相关的几个概念。javascript中this总是指向一个对象,但具体指向谁是在运行时根据函数执行环境动态绑定的,而并非函数被声明时的环境。除去不常用的with和eval的情况,具体到实际应用中,this指向大致可以分为以下4种。

作为对象的方法调用当函数作为对象的方法被调用时,this指向该对象:

var person = {

name: 'twy',

getName: function() {

console.info(this === person); // 输出true

console.info(this.name); // 输出twy

}

}

person.getName();作为普通函数调用当函数作为普通的函数被调用时,非严格模式下this指向全局对象:

function getName(){

// 非严格模式

console.info(this === window); // 浏览器环境下输出true

}

getName();严格模式下this为undefined:

function getName(){

// 严格模式

"use strict"

console.info(this === window); // 输出false

}

getName();构造器调用当new一个对象时,构造器里的this指向new出来的这个对象:

function person(){

// 构造函数

this.color = 'white';

}

var boy = new person();

console.info(boy.color); // 输出whitecall或apply调用用 Function.prototype.apply 或 Function.prototype.call 可以动态改变传入函数的this指向:

// 声明一个父亲对象,getName方法返回父亲的名字

var father = {

name: 'twy',

getName: function(){

return this.name;

}

}

// 生命一个儿子对象,但是没有返回名字的功能

var child = {

name: 'chy'

}

console.info(father.getName()); // 输出twy

// 使用call或apply将father.getName函数里this指向child

console.info(father.getName.call(child)); // 输出chy

console.info(father.getName.apply(child)); // 输出chy

JavaScript函数如何使用

函数就是通过共同定义相同的处理并使其可以多次使用,接下来的这篇文章就来给大家介绍关于JavaScript中函数的用法。

如果代码很多的话,有时可能需要用到大量相同的处理,虽然可以通过复制粘贴来省去时间,但是代码会变得很长,不方便后续的一些操作,这时候我们可以将相同的处理定义为一个函数,然后调用这个函数,这样代码就会看起来非常的简洁了。

此外函数还有一个优点,当需要处理的部分代码需要进行共同的变化时,只需要更改一处就可以了。

下面我们来看JavaScript中函数的定义

基本形式

在定义函数时首先需要的是function。之后写下给函数的名称并在{}中写入需要的处理,最简单的编写的话就像下面这样

<script>

function 函数名( ) {

处理的代码

}

</script>参数和返回值

此外,如果要将参数传递给函数,请将参数名称放在括号中。您可以根据需要添加任意数量的参数,以“,”分隔。因此,即使进行相同的处理,也可以地根据传递的参数进行内容的处理。

另外,如果你想获得这个调用函数的处理结果,使用return的关键字,则会传递函数中处理的结果返回值。

<script>

function 函数名(参数1,参数2,...){

处理的代码

return 返回值;

}

</ script>我们下面来看使用函数编程的具体例子

我们先使用变量来编写,将变量定义为money,根据输入的money的值,用document.write输出字符串“有钱人”,“普通人”,“贫穷”三个类型。

代码如下

<!DOCTYPE html>

<html>

<head>

<meta charset = "utf-8">

<title>JavaScript</title>

</head>

<body>

<script>

var money;

if (money > 5000) {

document.write("有钱人");

} else if (money > 3000){

document.write("普通人");

} else {

document.write("贫穷");

}

</script>

</body>

</html>基于上述代码,根据输入的money值,执行的结果会为“有钱人”或“普通人”或“贫穷”,如果不使用函数,则必须写入相同的代码。

<script>

var money=10000;

if (money > 5000) {

document.write("有钱人");

} else if (money > 3000){

document.write("普通人");

} else {

document.write("贫穷");

}

</script>变量money的值输入10000,则输出结果为“有钱人”

当变量money输入为4000,结果就为"普通人",输入money的值为2000时就是“贫穷”。

所以你只需要改变var money的值,其他都不需要改变,但代码就会变得很多,这个时候如果定义一个函数,代码就会变得简单的多

我们接着就来看使用函数具体的示例

这里的函数名称是judge。因为想根据输入变量money的值来判断“有钱人”“普通人”“贫穷”。

实际上,您无法分辨传递给函数的信息是什么,因此使用变量money定义参数。该函数将根据进入变量money的值来改变输出的值和字符串。

function judge(money) {

if (money > 5000) {

document.write("有钱人");

} else if (money > 3000){

document.write("普通人");

} else {

document.write("贫穷");

}

}这样做的话,就可以删除目前已编写和重复多次的代码,并将其替换为名为judge的函数。

代码如下

<script>

function judge(money) {

if (money > 5000) {

document.write("有钱人");

} else if (money > 3000){

document.write("普通人");

} else {

document.write("贫穷");

}

}

var money = 10000;

judge(money);

var money = 4000;

judge(money);

var money = 2000;

judge(money);

</script>运行结果如下

使用return值返回

也可以在不使用document.write的情况下返回判断结果的字符串。这种情况下,使用返回值return。将判断结果的字符串“有钱人”“普通”“穷”代入后,最后用return返回到result的变量的值。

代码如下

<script>

function judge(money) {

var result;

if (money > 5000) {

result = "有钱人";

} else if (money > 3000){

result = "普通人";

} else {

result = "贫穷";

}

return result;

}

var money = 10000;

var result = judge(money);

document.write(result);

var money = 4000;

var result = judge(money);

document.write(result);

var money = 2000;

var result = judge(money);

document.write(result);

</script>运行效果不变

最后,我们来简单看一下什么是局部变量

局部变量是指在函数中定义的变量,并且只在该函数中有作用。

使用“var变量名”声明与普通变量没有区别,但在局部变量的情况下,它是在function中声明。

帮我找美食网还为您提供以下相关内容希望对您有帮助:

javascript中函数调用的方法有几种?

方式1,调用函数,得到返回值。强制运算符使函数调用执行(function(x,y){ alert(x+y); return x+y; }(3,4)); 方式2,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用再去调用执行(function(x,y){...

JS中this指向的几种函数调用方法的介绍

作为对象的方法调用当函数作为对象的方法被调用时,this指向该对象:var person = { name: 'twy', getName: function() { console.info(this === person); // 输出true console.info(this.name); // 输出twy }}p...

javascript 怎么调用C#后台的函数

方法一:1、首先建立一个按钮,在后台将调用或处理的内容写入button_click中;2、在前台写一个js函数,内容为document.getElementById("btn1").click();3、在前台或后台调用js函数,激发click事件,等于访问后台c#函数;方法...

js怎么调用方法

1:方法调用模式。请注意this此时指向myobject。/*方法调用模式*/ var myobject={ value:0,inc:function(){ alert(this.value)} } myobject.inc()2:函数调用模式 请注意this此时指向window /*函数调用模式*/ var add...

JavaScript函数如何使用

下面我们来看JavaScript中函数的定义基本形式在定义函数时首先需要的是function。之后写下给函数的名称并在{}中写入需要的处理,最简单的编写的话就像下面这样function 函数名( ) {处理的代码}参数和返回值此外,如果要将参数...

JS函数的几种定义方式分析_javascript技巧

第二种是将一匿名函数赋给一个变量,调用方法:func2([函数]);第三种是将func4赋给变量func3,调用方法:func3([函数]);或func4([函数]);第四种是声明func5为一个对象。再看看它们的区别:但同样是定义函数,在...

如何在js函数中调用另外一个函数

①如果是最简单的一个方法:functiuon dome1(){ //.代码块}//调用方法就是:dome1()。②如果是闭包形式:function dome1(){ function dome2(){ } return function dome3(){ }}//这里可以访问dome1方法内的dome3...

Js 怎么调用(function () {里的函数?

})();ta();//执行ta,弹出信息1 补充:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。这种写法就是闭包的写法...

如何用js调用后台方法

方法一:1、首先建立一个按钮,在后台将调用或处理的内容写入Button1_Click中;protected void Button1_Click(object sender, EventArgs e) { this.TextBox1.Text = "voodooer"; }2、在前台可以这样调用: 方法二:1...

详细解读JavaScript中的几种借用方法(图文教程)

一个常用的例子是,当对象和数组都是列表类型的数据结构时,对象可以从数组“借用”方法。最常借用的方法是 Array.prototype.slice。借用方法之所以可行,是因为 call 和 apply 方法允许在不同上下文中调用函数,这也是重用已有...

Top