GVKun编程网logo

(转)javascript中为何在匿名function函数后面还外加一个括号(js的function匿名函数)

13

本文将带您了解关于的新内容,同时我们还将为您解释转javascript中为何在匿名function函数后面还外加一个括号的相关知识,另外,我们还将为您提供关于ECMAScript中函数function

本文将带您了解关于的新内容,同时我们还将为您解释转javascript中为何在匿名function函数后面还外加一个括号的相关知识,另外,我们还将为您提供关于ECMAScript中函数function类型_javascript技巧、javascript Function函数理解与实战、javascript Function函数理解与实战_基础知识、JavaScript function函数种类详解的实用信息。

本文目录一览:

(转)javascript中为何在匿名function函数后面还外加一个括号(js的function匿名函数)

(转)javascript中为何在匿名function函数后面还外加一个括号(js的function匿名函数)

详细研究过Javascript代码库(如Jquery、YUI)的人,一定会看到过很多如下形式的函数:  (function(){...}())或 (function(){})()

它可以解释成为“匿名函数自调用”,也就是说,定义一个匿名函数,然后马上调用它(因为它是匿名的,如果不立即调用就获取不到该函数的引用了)。通常它被应用在一些大型的JS框架中(如上面所说的),因为这个匿名函数的函数体相当于提供一个匿名的名字空间,这样就不会再与用户自定义的JS函数、变量、对象发生冲突了。尽管JS没有显示地提供命名空间的定义和使用机制,但这种匿名方式却不失为是一种很好的解决命名空间问题的方法。

所以说,(function(){代码})()就等于执行了一个函数,只不过它是匿名的而已。如果在这个匿名函数内部想再次调用这个函数,就需要调用constructor属性了(这是Object中定义的,JS的继承机制如同Java一样保证了了所有对象都继承Object类)。

具体举个例子:

function test(){
            return (function(p1,p2){
                return p1+p2;
            })(1,2);
        }
        (function(){
            alert(test());
        })();//3

深入研究一下这种匿名函数:

function Foo() {
            var a = 123;
            this.a = 456;
            (function () {
                alert(a); // 123
                alert(this.a); // undefined 
            })();
        };
        var f=new Foo();
1         function Foo() {
2             var a = 123;
3             this.a = 456;
4             (function (_this) {
5                 alert(a); // 123
6                 alert(_this.a); // 456 
7             })(this);
8         };
9         var f = new Foo();

以上两个对比,说明:

 

(1)匿名函数可以直接访问到外层署名函数(Foo)中的变量(使用关键字var定义的),但不能访问外层署名函数的属性(使用关键字this定义的);

 

(2)匿名函数中的this指向的是匿名函数对象的地址,它与外层署名函数(Foo)对象的this指向的地址不同;

 

(3)匿名函数若要访问外层署名函数(Foo)中的属性,可以通过参数传递的方式实现。

1         function Foo() {
2             var a = 123;
3             this.a = 456;
4             (function (b) {
5                 alert(a); // 123
6                 alert(b); // 456 
7             })(this.a);
8         };
9         var f = new Foo();
1         (function () {
2             var a = 123;
3             this.a = 456;
4             (function () {
5                 alert(a); // 123
6                 alert(this.a); // 456 
7             })();
8         })();

以上两个对比,说明:

 

(1) 匿名函数既可以直接访问外层匿名函数中的变量,又直接可以访问外层匿名函数中的属性,而匿名函数却不可以直接访问外层已命名函数中的属性;

 

(2)以上两种方式可以实现相同的功能。

 1         (function () {
 2             var a = 123;
 3             this.a = 456;
 4             (function () {
 5                 alert(a); // 123 
 6                 alert(this.a); // 456 
 7                 this.b = 789;
 8             })();
 9             (function () {
10                 alert(this.b); // 789 
11             })();
12         })();
13         (function () {
14             alert(this.a); // 456
15             alert(this.b); // 789 
16         })();
 1         function Foo() {
 2             var a = 123;
 3             this.a = 456;
 4             (function () {
 5                 alert(a); // 123 
 6                 alert(this.a); // undefined 
 7                 this.b = 789;
 8             })();
 9             (function () {
10                 alert(this.b); // 789 
11             })();
12         };
13         var f = new Foo();
14         (function () {
15             alert(this.a); // undefined
16             alert(this.b); // 789 
17         })();

以上两个对比,说明:

 

(1)匿名函数(即用两个小括号括起来的部分)位于一个执行上下文,不论这些代码放在哪个位置上。

 1         function Foo() {
 2             (function () {
 3                 this.b = 789;
 4             })();
 5             (function () {
 6                 alert(this.b); // 789
 7                 alert(b); // 789
 8                 var a = 0;
 9                 alert(a); // 0
10             })();
11         }
12         var f = new Foo();
13         (function () {
14             alert(this.b); // 789
15             alert(b); // 789
16         })();
 1         function Foo() {
 2             (function () {
 3                 this.b = 789;
 4             })();
 5             (function () {
 6                 alert(this.b); // 789
 7                 alert(b); // undefined
 8                 var b = 0;
 9                 alert(b); // 0
10             })();
11         }
12         var f = new Foo();
13         (function () {
14             alert(this.b); // 789
15             alert(b); // 789
16         })();

以上两个对比,说明:

 

(1)没有加 this取值时,如果当前 {} 中不存在同名的局部变量,则等同于加 this 处理;如果当前 {} 中存在同名的局部变量,则按常规处理。

 

转载地址

ECMAScript中函数function类型_javascript技巧

ECMAScript中函数function类型_javascript技巧

说起来ecmascript中上面最有意思,我想那莫过于函数了,有意思的根源,则在于函数实际上是对象。每个函数都是function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的,如下例子:

复制代码 代码如下:

 function sum(num1,num2)
 {
    return num1+num2;
 }

这与下面使用函数表达式定义函数的方式几乎相差无几。

复制代码 代码如下:

 var sum=function(num1,num2)
 {
     return num1+num2;
 };

  以上代码定了变量sum并将其初始化为一个函数。你们会注意到,function关键字后面没有函数名。这是因为在使用函数表达式定义函数时,没有必要使用函数名(通过变量sum既可以引用函数)。另外,还要注意函数末尾有一个分号,就像声明其他变量时一样。

  最后一种定义函数的方式是使用Function构造函数。Function构造函数可以接受任意数量的参数,但最后一个参数始终都会被看成函数体,而前面的参数则枚举出了新函数的参数。如下例子:

复制代码 代码如下:

var sum=new Function("num1","num2","return num1+num2");//不推荐

  从技术角度讲,这是一个函数表达式。但是,我们不推荐使用这种方法定义函数, 因为这种语法会导致解析两次代码(第一次解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。不过,这种语法对于理解“函数是对象,函数名是指针”的概念都是非常直观的。

立即学习“Java免费学习笔记(深入)”;

由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。换句话说,一个函数可能会有多个名字,如下例子:

复制代码 代码如下:

function sum(num1,num2)
{
    return num1+num2;
}
alert(sum(10,10));//20
var anotherSum=sum;
alert(anotherSum(10,10));//20
sum=null;
alert(anotherSum(10,10));//20

  以上代码首先定义了一个名为sum()的函数,用于求两个值的和。然后,有声明了变量anotherSum,并将其设置为sum()相等(将sum的值赋给anotherSum)。注意,使用不带圆括号的函数名是访问函数指针,而非调用函数。此时,anotherSum和sum 就指向了同一个函数,因此anotherSum()也可以被调用并返回结果。即使将sum设置为null,让它与函数“断绝关系”,但仍然可以证明正常调用anotherSum()。

以上所述就是本文的全部内容了,希望能够对大家学习javascript有所帮助。

javascript Function函数理解与实战

javascript Function函数理解与实战

Function函数是javascript的基础也是实现功能的一个引爆点,我们通过实例分析让你对Function函数有一个更加深刻的理解以及在实际中的用法讲解。

Function 确实是一个对象.而我们定义的任何一个函数其实都是Function 对象的一个实例,也可以理解为指向 Function 对象的一个实例.

既然是对象的一个实例,那肯定指向了Function 类型的一个引用. 既然指向了一个引用类型的内存地址,那你也可以简单的把我们定义的函数理解为一个变量,这个变量指向了一个引用类型的地址,这个地址指向了Function 对象的一个实例.

既然我们定义的函数其实是一个变量,那这个函数实例地址可以同时指向多个变量.

看下面的代码:

var add = new Function("n", "m", "return n + m");

上面是标准的函数定义,调用了Function对象的构造函数,这个构造函数把前面的N个参数都默认为新函数的参数,直到最后一个参数认为是新函数的函数体.

从上面的语句中非常直观的看到 add这个变量指向了一个Function 类型的实例,但是这种命名方法非常繁琐,等价于:

(1)函数表达式

var add=function(n,m){
return n+m;
}

(2)函数申明

function add(n,m){
return n+m;
}

由于javascript语言中的申明提前,所以一版提倡用第二种方法定义函数,关于函数申明提前单独开辟一篇来说

但是第一种定义方法让人很直观看到 add 是一个指向函数实例的一个变量.

既然是一个变量,就可以赋值给其他变量,可以当做参数在函数中传递,也可以从函数返回.

所以 var add2=add3=add; 现在 三个变量都指向了这个实例的引用, 现在 add=null; 以后 add2,add3 俩个函数完全可以使用不受影响,因为add 移除函数对象的引用后指向了null的引用.所以根本不影响add2 和 add3 两个函数.

所以函数可以当做其他函数的参数传入.

所以函数可以当做函数的返回值返回.

因为函数名只是一个指向函数实例的变量,所以javascript中函数不会有 重载,因为相同的变量指向的是相同的引用地址.最后表示的还是同一个函数.

函数既然是对象的实例,那么就应该有属性,就应该有方法.所以javascript中的 函数有属性也有方法.

比较重要的4个属性 arguments , this , length , prototype

arguments 表示当前函数的参数类数组,这个属性很特殊,他自己还有个属性叫 callee ,

arguments.callee 属性保存了一个指针,指针指向了拥有此 arguments 属性的函数实体(也就相当于函数名)

this属性是当前环境,类似与C# 中的this,表示当前上下文

length 属性表示当前函数接收最大参数个数

prototype 表示该函数的原型,也就是把对象实例的方法完整的保存下来,换句话说就是原型上的方法都继承下来了.比如 toString() valueOf() 等.

接下来,我们来看看function函数种类

普通函数:介绍普通函数的特性:同名覆盖、arguments对象、默认返回值等。

function ShowName(name) {
 alert(name);
}

匿名函数:介绍匿名函数的特性:变量匿名函数、无名称匿名函数。

//变量匿名函数,左侧可以为变量、事件等
var anonymousNormal = function (p1, p2) {
 alert(p1+p2);
}
anonymousNormal(3,6);//输出9

闭包函数:介绍闭包函数的特性。

function funA() {
 var i = 0;
 function funB() { //闭包函数funB
  i++;
  alert(i)
 }
 return funB;
}
var allShowA = funA(); //全局变量引用:累加输出1,2,3,4等
 
function partShowA() {
 var showa = funA();//局部变量引用:只输出1
 showa();
}

您可能感兴趣的文章:

javascript Function函数理解与实战_基础知识

javascript Function函数理解与实战_基础知识

小编给大家带来一片关于javascript的基础教学内容,关于javascript中的function函数的训练与理解,对javascript感兴趣的同学一起学习下吧。

Function函数是javascript的基础也是实现功能的一个引爆点,我们通过实例分析让你对Function函数有一个更加深刻的理解以及在实际中的用法讲解。

Function 确实是一个对象.而我们定义的任何一个函数其实都是Function 对象的一个实例,也可以理解为指向 Function 对象的一个实例.

既然是对象的一个实例,那肯定指向了Function 类型的一个引用. 既然指向了一个引用类型的内存地址,那你也可以简单的把我们定义的函数理解为一个变量,这个变量指向了一个引用类型的地址,这个地址指向了Function 对象的一个实例.

既然我们定义的函数其实是一个变量,那这个函数实例地址可以同时指向多个变量.

立即学习“Java免费学习笔记(深入)”;

看下面的代码:

var add = new Function("n", "m", "return n + m");

上面是标准的函数定义,调用了Function对象的构造函数,这个构造函数把前面的N个参数都默认为新函数的参数,直到最后一个参数认为是新函数的函数体.

从上面的语句中非常直观的看到 add这个变量指向了一个Function 类型的实例,但是这种命名方法非常繁琐,等价于:

(1)函数表达式


var add=function(n,m){
return n+m;
}
登录后复制

(2)函数申明


function add(n,m){
return n+m;
}
登录后复制

由于javascript语言中的申明提前,所以一版提倡用第二种方法定义函数,关于函数申明提前单独开辟一篇来说

但是第一种定义方法让人很直观看到 add 是一个指向函数实例的一个变量.

既然是一个变量,就可以赋值给其他变量,可以当做参数在函数中传递,也可以从函数返回.

所以 var add2=add3=add; 现在 三个变量都指向了这个实例的引用, 现在 add=null; 以后 add2,add3 俩个函数完全可以使用不受影响,因为add 移除函数对象的引用后指向了null的引用.所以根本不影响add2 和 add3 两个函数.

所以函数可以当做其他函数的参数传入.

所以函数可以当做函数的返回值返回.

因为函数名只是一个指向函数实例的变量,所以javascript中函数不会有 重载,因为相同的变量指向的是相同的引用地址.最后表示的还是同一个函数.

函数既然是对象的实例,那么就应该有属性,就应该有方法.所以javascript中的 函数有属性也有方法.

比较重要的4个属性 arguments , this , length , prototype

arguments 表示当前函数的参数类数组,这个属性很特殊,他自己还有个属性叫 callee ,

arguments.callee 属性保存了一个指针,指针指向了拥有此 arguments 属性的函数实体(也就相当于函数名)

this属性是当前环境,类似与C# 中的this,表示当前上下文

length 属性表示当前函数接收最大参数个数

prototype 表示该函数的原型,也就是把对象实例的方法完整的保存下来,换句话说就是原型上的方法都继承下来了.比如 toString() valueOf() 等.

接下来,我们来看看function函数种类

普通函数:介绍普通函数的特性:同名覆盖、arguments对象、默认返回值等。


function ShowName(name) {
 alert(name);
}
登录后复制

匿名函数:介绍匿名函数的特性:变量匿名函数、无名称匿名函数。


//变量匿名函数,左侧可以为变量、事件等
var anonymousNormal = function (p1, p2) {
 alert(p1+p2);
}
anonymousNormal(3,6);//输出9
登录后复制

闭包函数:介绍闭包函数的特性。


function funA() {
 var i = 0;
 function funB() { //闭包函数funB
  i++;
  alert(i)
 }
 return funB;
}
var allShowA = funA(); //全局变量引用:累加输出1,2,3,4等
 
function partShowA() {
 var showa = funA();//局部变量引用:只输出1
 showa();
}
登录后复制

相关推荐:

js函数参数的按值传递解释

关于js函数中this的理解

深入理解JS函数的参数(arguments)的使用

以上就是javascript Function函数理解与实战_基础知识的详细内容,更多请关注php中文网其它相关文章!

JavaScript function函数种类详解

JavaScript function函数种类详解

本篇主要介绍普通函数、匿名函数、闭包函数

目录

1. 普通函数

1.1 示例

rush:js;"> function ShowName(name) { alert(name); }

1.2 Js中同名函数的覆盖

在Js中函数是没有重载,定义相同函数名、不同参数签名的函数,后面的函数会覆盖前面的函数。调用时,只会调用后面的函数。

rush:js;"> var n1 = 1;

function add(value1) {
return n1 + 1;
}
alert(add(n1));//调用的是下面的函数,输出:3

function add(value1,value2) {
return value1 + 2;
}
alert(add(n1));//输出:3

1.3 arguments对象

arguments 类似于C#的params,操作可变参数:传入函数的参数数量大于定义时的参数数量。

rush:js;"> function showNames(name) { alert(name);//张三 for (var i = 0; i < arguments.length; i++) { alert(arguments[i]);//张三、李四、王五 } } showNames('张三','李四','王五');

1.4 函数的默认返回值

若函数没有指明返回值,默认返回的是'undefined'

rush:js;"> function showMsg() { } alert(showMsg());//输出:undefined   

2.匿名函数

2.1 变量匿名函数

2.1.1 说明 可以把函数赋值给变量、事件。

2.1.2 示例

rush:js;"> //变量匿名函数,左侧可以为变量、事件等 var anonymousnormal = function (p1,p2) { alert(p1+p2); } anonymousnormal(3,6);//输出9

2.1.3 适用场景 ①避免函数名污染。若先声明个带名称的函数,再赋值给变量或事件,就造成了函数名的滥用。

2.2 无名称匿名函数

2.2.1 说明 即在函数声明时,在后面紧跟参数。Js语法解析此函数时,里面代码立即执行。

2.2.2 示例

rush:js;"> (function (p1) { alert(p1); })(1);

2.2.3 适用场景 ①只需执行一次的。如浏览器加载完,只需要执行一次且后面不执行的功能。

3. 闭包函数

3.1 说明

假设,函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数。

3.2 示例

3.2.1 示例1:全局引用与局部引用

rush:js;"> function funA() { var i = 0; function funB() { //闭包函数funB i++; alert(i) } return funB; } var allShowA = funA(); //全局变量引用:累加输出1,2,3,4等

function partShowA() {
var showa = funA();//局部变量引用:只输出1
showa();
}

allShowA是个全局变量,引用了函数funA。重复运行allShowA(),会输出1,4等累加的值。

执行函数partShowA(),因为内部只声明了局部变量showa来引用funA,执行完毕后因作用域的关系,释放showa占用的资源。

闭包的关键就在于作用域:全局变量占有的资源只有当页面变换或浏览器关闭后才会释放。var allShowA = funA() 时,相当于allShowA引用了funB(),从而使funB()里的资源不被GC回收,因此funA()里的资源也不会。

3.2.2 示例2:有参闭包函数

rush:js;"> function funA(arg1,arg2) { var i = 0; function funB(step) { i = i + step; alert(i) } return funB; } var allShowA = funA(2,3); //调用的是funA arg1=2,arg2=3 allShowA(1);//调用的是funB step=1,输出 1 allShowA(3);//调用的是funB setp=3,输出 4

3.2.3 示例3:父函数funA内的变量共享

rush:js;"> function funA() { var i = 0; function funB() { i++; alert(i) } allShowC = function () {// allShowC引用匿名函数,与funB共享变量i i++; alert(i) } return funB; } var allShowA = funA(); var allShowB = funA();//allShowB引用了funA,allShowC在内部重新进行了绑定,与allShowB共享变量i

3.3 适用场景

①保证函数funA内里的变量安全,因为外部不能直接访问funA的变量。

以上就是本文的全部内容,希望对大家的学习有所帮助。

我们今天的关于转javascript中为何在匿名function函数后面还外加一个括号的分享已经告一段落,感谢您的关注,如果您想了解更多关于ECMAScript中函数function类型_javascript技巧、javascript Function函数理解与实战、javascript Function函数理解与实战_基础知识、JavaScript function函数种类详解的相关信息,请在本站查询。

本文标签: