JS里面匿名函数的调用 & 变量作用域的实验

参考 http://www.educity.cn/wenda/54753.html

已实验验证结果正确。

1、下列哪些正确?(B、C)
  A.function(){
  alert("Here!");
  }();
  B.(function(){
  alert("Here!");
  })();
  C.(function(){
  alert("Here!");
  }());

下面也已经实验验证结果正确。

2、下列哪个结果是正确的?(A、B、C、D)
  A.(function(a1,a2){
  alert("Here!"+(a1+a2));
  })(1,2);
  B.(function(a1,a2){
  alert("Here!" +(a1+a2));
  }(1,2));
  C.void function(a1,a2){
  alert("Here!" +(a1+a2));
  }(1,2);
  D.var f = function(a1,a2){
  alert("Here!" +(a1+a2));
  }(1,2);

注:A 、B、C与D四种格式都正确,前两者属于同种情况的不同写法,后两种是将函数对象的返回值赋给其他变量,C是忽略函数返回值,而D正相反!

下面这个的结果也验证,但是注意,稍稍改一下,效果就很大差别。

function Foo() {
    var a = 123;
    this.a = 456;
    (function() {
        console.log(a); // 123
        console.log(this.a); // undefined
    })();
};
var f = new Foo();

结果:
123
undefined

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

稍微改一下,把Foo前面的new去掉,直接调用Foo,如下:

function Foo() {
    var a = 123;
    this.a = 456;
    (function() {
        console.log(a); // 123
        console.log(this.a); // undefined
    })();
};
var f = Foo();

结果:
123
456

然后在最后分别加上console.log(f)看看f被赋予什么内容:

var f = new Foo();
console.log(f);

结果:
Foo { a: 456 }

var f = Foo();
console.log(f);

结果:
undefined

开始写自己代码的时候,发现了下面的情况。本来以为是node跟原生js的区别呢,看来不是。

/**
 * Created by baidu on 16/10/24.
 */
function test(){
    var a = 123;
    this.a = 456;
    return (function(p1,p2){
        console.log(a);
        console.log(this.a);
        return p1+p2;
    })(1,2);
};
(function(){
    console.log(test());
}());

用node跑:
123
456
3

内部要访问数据,可以通过传参数(方法一):

function Foo() {
    var a = 123;
    this.a = 456;
    (function(_this) {
        console.log(a); // 123
        console.log(_this.a); // 456
    })(this);
};
var f = new Foo();

结果:
123
456

另外,注意下面这种情况:

(function() {
    var a = 123;
    this.a = 456;
    (function() {
        console.log(a); // 123
        console.log(this.a); // 456
    })();
})();

结果:
123
456

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

访问没有定义过的this.xxx,也是很有意思的:

/**
 * Created by baidu on 16/10/24.
 */

function Foo() {
    var a = 123;
    this.a = 456;
    (function() {
        console.log(a); // 123
        console.log(this.a); // undefined
        this.b = 789;
    })();
    (function() {
        console.log(this.b); // 789
    })();
};
var f = new Foo();
(function() {
    console.log(this.a); // undefined
    console.log(this.b); // 789
})();结果:

123
undefined
789
undefined
789

后面分析。

再来一个里外都是匿名函数的情况:

/**
 * Created by baidu on 16/10/24.
 */

(function() {
    var a = 123;
    this.a = 456;
    (function() {
        console.log(a); // 123
        console.log(this.a); // 456
        this.b = 789;
    })();
    (function() {
        console.log(this.b); // 789
    })();
})();
(function() {
    console.log(this.a); // 456
    console.log(this.b); // 789
})();

结果:
123
456
789
456
789

通过上面两个例子的对比及分析,可以看出如下结论:

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

再比较下面两种情况:

情况1:

function Foo() {
    (function() {
        this.b = 789;
    })();
    (function() {
        console.log(this.b); // 789
        console.log(b); // 789
        var a = 0;
        console.log(a); // 0
    })();
}
var f = new Foo();
(function() {
    console.log(this.b); // 789
    console.log(b); // 789
})();

结果:
789
789
0
789
789

情况2:

/**
 * Created by baidu on 16/10/24.
 */

function Foo() {
    (function() {
        this.b = 789;
    })();
    (function() {
        console.log(this.b); // 789
        console.log(b); //undefined
        var b = 0;
        console.log(b); // 0
    })();
}
var f = new Foo();
(function() {
    console.log(this.b); // 789
    console.log(b); // 789
})();

结果:
789
undefined
0
789
789

从以上对比,可以看出:

没有加 this取值时,如果当前 {} 中不存在同名的局部变量,则等同于加 this 处理;如果当前 {} 中存在同名的局部变量,则按常规处理。
上面第二例中,b会打印出undefined,是因为在{}出现了b,并且是在后面出现的,当前还是undefined.

以上,是一些实验结果。

时间: 2024-10-20 07:27:36

JS里面匿名函数的调用 & 变量作用域的实验的相关文章

[沫沫金]JS匿名函数this调用变量报错

背景 今天使用Dcloud扫码功能,success成功方法设置data中的scanContext变量,报"undefined"! 思路 一.怀疑是扫码内容不是JSON对象,无法点属性报错.排除,使用JSON.parse转换成功后,依然报"undefined".二.怎么就"undefined"呢,百思不得其解.继续想办法 解决 突然,看到附件选择的方法,人家是设置的this.fileUrl成功的.比对下,什么区别.发现定义的匿名方法,写法不同.我的

JS的三种使用方式/CSS的三种使用方式/JS中的DOM事件模型/JS中匿名函数的书写及调用/媒体查询@media的三种使用方式

一.JS的三种使用方式 1.html标签中内嵌JS(不提倡使用.)                <button onclick="javascript:alert('你真点啊.')" > 有本事点我呀!!!!</button>                                2.HTML页面中直接使用JS:                <script type="text/javascript">        

JS匿名函数之调用

何为匿名函数 很多东西我们可以通过字面就可以理解,当然也不是所有的都可以通过字面能理解的,因为程序语言毕竟是个很抽象的东西,光从字面理解肯定不够也不行,但是匿名函数就可以.所谓匿名函数就是没有名称的函数,例如下面这种: function (b) { a=1; c=a+b; return c; } 上面很简单,就是在我们定义一个函数的时候,我们并没有给它一个名称,这就是我们的匿名函数! 但是问题来了,匿名函数如何调用呢,我们都知道有名称的函数调用方式,例如: function jiujiu(b)

js之匿名函数

js之匿名函数   这篇博文内容来自于javascript高级程序设计第2版,向作者致敬 函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数

函数调用的几种方法 几种主流框架使用匿名函数模仿块级作用域的方式

函数调用的几种方法 js 里函数调用有4种模式:方法调用.正常函数调用.构造器函数调用.apply/call 调用.同时,无论哪种函数调用除了你声明时定义的形参外,还会自动添加2个形参,分别是 this 和 arguments.这里你既然问 this,那么就只谈 this.this 的值,在上面4中调用模式下,分别会绑定不同的值.分别来说一说:方法调用:这个很好理解,函数是一个对象的属性,比如 var a = { v : 0, f : function(xx) { this.v = xx; }

匿名函数模仿块级作用域

问题 [无块级作用域]JavaScript中没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. function outputNumbers(count){ for(var i = 0; i < count; i++){ alert(i); } console.log(i); } outputNumbers(2);//弹出0,1输出2 //变量i是定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函数内部随时访问它. 函数中的

272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**

什么是函数? 用来实现特定功能的, n条语句的封装体 只有函数类型的数据是可以执行的, 其它的都不可以 为什么要用函数? 提高复用性 便于阅读交流 函数也是对象 instanceof Object===true 函数有属性: prototype 函数有方法: call()/apply() 可以添加新的属性/方法 函数的3种不同角色 一般函数 : 直接调用 构造函数 : 通过new调用 对象 : 通过.调用内部的属性/方法 函数中的this 显式指定谁: obj.xxx() 通过call/appl

javascript匿名函数自调用

// 匿名函数的自调用 /*var f1 = function() { console.log('我是一个匿名函数!'); }*/ // f1(); // 上面是定义一个匿名函数,然后调用,其实上面就是变量名,然后使用()来调用 // 这样会报错,原因是因为函数体的的大括号分开了,解释不了,可以使用小扩号来调优先级 /*function f2(){ console.log('是我是一个匿名函数,并且是自调用!'); }();*/ (function f3(name){ console.log('

总结下js中匿名函数的写法~好几天没写博客了。。。

小哥最近很是心烦啊,不仅仅要继续以现任前端小白,未来前端攻城狮的身份苦逼学习,还要用剩余的时间去完成毕业设计.早知如此,当初我为毛要报考数学这么个苦逼专业....昨天一整天的时间在研究毕设,感觉代码已经不认识我了...今天在学习中,突然发现了匿名函数的调用方法.原以为匿名函数是个高冷的生物,只有如下这一种调用方法: (function() { alert('water'); })(); 当然了...设参数跟上面是一样的方法: (function(i) { alert(i); })('water'