首先,看一段很有意思的代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>匿名</title>
<script type="text/javascript">
(function() {
aa = ;
})();
alert(aa);
</script>
</head>
<body>
</body>
</html>

这个结果是什么?

很多时候在看第三方js插件时,会看的(function(){})(); 这种样子的代码。.net程序猿很费解。

这种写法是非常好的方式。

javascript是一种上手简单,往后学就会觉得比较难,再往后又会觉得简单的语言。(看的资料上很多这么说,不幸的是我一直觉得它很难。)写javascript千万不能把它当类似C语言的写法写。javascript可以说都是对象。(function(){})();这么个写法,不知道专业人员怎么说,我的理解是函数表达式和执行函数。因为没有var 所以可以节省变量,不会给window下添加新的对象。

不会给window下添加新的对象,这句话怎么理解呢?

首先应该说下javascript的变量作用域,javascript是没有块作用域,变量一旦声明,就会在整个方法体中。下面代码;alert出的结果是2。而不会报变量未定义的错误。但在A方法外,i 变量就出作用域了。

<script type="text/javascript">
function A()
{
for(var i=;i<;i++)
{}
alert(i);
}
A();
</script>
 

下段代码会弹出undefined 和2。这时候A(); 也可以通过window.A();来调用。 注意这里 为何是 undefined  而不是报的 a is not defined ?

function A()
{
alert(a);
var a = "";
alert(a);
}
A();//可以换成 window.A();

变量a,也会添加到window下。可以这么调用  window.a;   看下面代码:

<script type="text/javascript">
var a;
</script>

接下来再说函数表达式。var A=function(){alert(1);};

这种声明方法和function A(){} 大体相同,不同就是有执行先后顺序的区别。就像定义变量一样。看下面代码:这时可以弹出1。

A():
function A()
{
alert();
}

换成下面这种则会报A is not a function。 var A =function(){alert(1);}必须要在 A(); 之前。

A();
var A = function () {
alert();//必须在A();执行方法 前面。
};

有了这些知识。理解(function(){alert();})();这种方式的代码就简单了。 就是一个函数表达式 立即执行。

(function()
{
alert(1);
})();

把function(){alert(1);} 换成上面的A.因为 A==function (){alert(1);}  所以就成上面的样子。

变量A存放方法的引用地址。

这样window下也没有新增对象。 有些地方会说不会污染全局变量。

在写js插件时,只暴露一个对象,供调用。可以这么写,看下面代码:

(function(){
window.cjc={
A:function(){
       alert(1);
     },
Sum:function(a,b){
     alert(a+b);
     }
};
})();

暴露出 cjc  一个变量。使用A方法时,cjc.A(); 使用Sum方法时,cjc.Sum(1,2);

还可以这么写。看面代码:

(function (nc) {
nc.A = function () {
alert();
};
nc.Sum = function (a, b) {
alert(a + b);
};
})(cjc = {});
//调用Sum方法
cjc.Sum(,);

当暴露的变量有冲突时,可以换,只要把 cjc={} 换成别的就行如下面代码:

(function (nc) {
nc.A = function () {
alert();
};
nc.Sum = function (a, b) {
alert(a + b);
};
})(test = {});
//调用Sum方法
test.Sum(,);

为何可以使用test={} 这种形式?js的语法,上面的代码可以等效成下面这种。

var test={};
(function (nc) {
nc.A = function () {
alert();
};
nc.Sum = function (a, b) {
alert(a + b);
};
})(test);
//调用Sum方法
test.Sum(,);

看下面这段代码。

if(a=)
{
alert(a);
}

结果是 alert出1。

javascript语法特性跟别的C、C#这类语言,区别还是不小的。此外javascript特性还有很多,function就有不少,像原型扩展等。感觉开始接触时实战好点。当能做出简单的东西时,要想提高还是得看基础。

能力不足,有地方理解不到位。

javascript匿名方法的更多相关文章

  1. (转)Javascript匿名函数的写法、传参、递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 javascript匿名函数的写法.传参和递归 http: ...

  2. (转)javascript匿名函数的写法、传参和递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 http://www.veryhuo.com 2011-0 ...

  3. 简单介绍Javascript匿名函数和面向对象编程

    忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...

  4. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  5. JavaScript匿名自执行函数~function(){}

    原博客:https://blog.csdn.net/yaojxing/article/details/72784774 1.匿名函数的常见场景 js中的匿名函数是一种很常见的函数类型,比较常见的场景: ...

  6. JavaScript匿名类整理学习笔记

    以下为总结在开源的JavaScript框架中能看到很多这样语法结构(function(){})()比如我最近看的jQuery,及chediter.刚开始的时候我看到这样的结果有点奇怪,它是怎么执行的, ...

  7. JavaScript匿名函数的使用

    JavaScript匿名函数的使用:  http://www.cnblogs.com/skykang/archive/2010/12/03/1895274.html 一.什么是匿名函数? 在Javas ...

  8. javascript 匿名函数的理解(转)

    原网址 http://www.jb51.net/article/21948.htm javascript 匿名函数的理解(透彻版) 代码如下: (function(){ //这里忽略jQuery所有实 ...

  9. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

随机推荐

  1. 洛谷——P2434 [SDOI2005]区间

    P2434 [SDOI2005]区间 题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间 ...

  2. linux otl oracle数据库连接例子

    #include <string> #include <iostream> using namespace std; #define OTL_ORA10G   //我连的是LI ...

  3. C语言取整方法总结

    C语言有下面几种取整方法: 1.   直接赋值给整数变量     int i = 3.5; 或 i = (int) 3.5; 这样的方法採用的是舍去小数部分. 2.整数除法运算符' / '取整 ' / ...

  4. http://vdceye.com/ 全新页面上线

    vdceye manager home page

  5. 怎么将本地文件上传到远程git仓库

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点“ ...

  6. C++ 虚函数与纯虚函数 浅析

    [摘要] 在虚函数与纯虚函数的学习中.要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异.掌握两者在实现上的必要性.熟悉纯虚函数在子类与孙类的函数类型.本文即针对上述问题展开阐述. ...

  7. POJ 1125 Stockbroker Grapevine (Floyd最短路)

    Floyd算法计算每对顶点之间的最短路径的问题 题目中隐含了一个条件是一个人能够同一时候将谣言传递给多个人 题目终于的要求是时间最短.那么就要遍历一遍求出每一个点作为源点时,最长的最短路径长是多少,再 ...

  8. 安装mint的问题集锦

    1.修改DNS解析配置 刚刚安装完mint可能现无法连接源的问题,总是说dns解析错误,这个可能是dns配置文件造成的,因为官网下的mint很可能是配置了国外的dns解析,比如我刚安上时,就是默认配置 ...

  9. sql 统计 url字符串处理

    SELECT SUBSTRING_INDEX(url,'/',1) AS wed_domain,COUNT(1),SUM(no_open_times),SUM(no_ad_times),SUM(ok_ ...

  10. XMU 1071 圣斗士黄金十二宫(七)银河星爆 【计算几何】

    1071: 圣斗士黄金十二宫(七)银河星爆 Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 193  Solved: 10[Submit][Status] ...