关于执行环境和作用域链,有一个疑惑

aipuduo 2015-07-19 11:10:18
var color = "red";
var o = { color: "blue"};

var m = {
a: 1,
b: function() {
alert(this.color);
}
};

o.c = m.b;
o.c();


上面这个程序是可以运行的,结果是blue
可是,函数b()是定义在对象m(m也是个环境吧)里面的,而对象b又定义在环境window中的。按道理,外部环境是不能调用内部环境的变量和方法的,可是倒数第二行的o.c = m.b却调用了m对象中的b()函数,而且是在全局环境中,这是怎么回事?
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sydhr_1994 2015-08-07
  • 打赏
  • 举报
回复
引用 6 楼 aipuduo 的回复:
[quote=引用 5 楼 sydhr_1994 的回复:] 其他的语言会是{}这样的大括号就算一个块作用域吧。 JS的{}并不是一个作用域
那function()后面的{}呢?[/quote] function ()后面的是。。。。我的意思就是说if和for后面的都不是一个作用域
aipuduo 2015-08-07
  • 打赏
  • 举报
回复
引用 5 楼 sydhr_1994 的回复:
其他的语言会是{}这样的大括号就算一个块作用域吧。 JS的{}并不是一个作用域
那function()后面的{}呢?
sydhr_1994 2015-07-20
  • 打赏
  • 举报
回复
其他的语言会是{}这样的大括号就算一个块作用域吧。 JS的{}并不是一个作用域
似梦飞花 2015-07-19
  • 打赏
  • 举报
回复
this指向了m啊 简单点说 谁调this就指向谁 不过有很多特殊的地方 一下子也想不起来了

var color = "red";
    var o = { color: "blue"};

    var m = {
        a: 1,
        b: function() {
            alert(this.color);
        }
    };

    var x= m.b
    x()
forwardNow 2015-07-19
  • 打赏
  • 举报
回复

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
<script>
    
/*

    你的问题涉及到:1. 函数也是对象,是值的一种类型;2. 函数与方法;3. this


    在JavaScript中, 函数不仅是一种语法, 也是值,
    即, 可以将函数赋值给变量, 存储在对象的属性或数组的元素中,
    作为参数传入给另外一个函数

    函数定义

        function square(x) {
            return x * x;
        }
        这个定义创建一个新的函数对象, 并将其赋值给变量square.
        函数的名字实际上是看不见的, 它(square)仅仅是变量的名字,
        这个变量指代函数对象.
        函数还可以赋值给其他的变量, 并且仍可以正常工作

    赋值给变量

        function square(x) {
            return x * x;
        }
        var s = square;
        square(4);  // => 16
        s(4);   // => 16

    赋值给对象的属性

        当函数作为对象的属性调用时,
        函数就称为方法.
        var o = {square: square}; // 对象直接量
        o.square(4);    // => 16

    赋值给数组的元素
        var a = [square, 4]; // 数组直接量
        a[0]( a[1] );   // => 16    

*/
/*

    至于 this 的问题,网上有更详细的解释,我就说两点吧。

    1. 函数里的 this 指向全局对象window:

        var x = 10;

        function f () {
            console.info( this.x );
        }
        
        f(); //=> 10

        我们定义的全局变量、函数都可以通过 window.x 、 window.f() 的方式引用,
        此时this代表的是window对象。(ES5的严格模式函数里的this为undefined)

    2. 方法里的 this 指向调用它的对象

        var o = { x: 20 };
        var x = 10;
        o.m = function () {
            console.info( this.x );
        };
        o.m(); //=> 20


*/


</script>



</body>
</html>
xuzuning 2015-07-19
  • 打赏
  • 举报
回复


可知
o.c = m.b
o.c = function() {
alert(this.color);
}
并没有什么区别

所以不要去理睬那些似懂非懂的说教
天际的海浪 2015-07-19
  • 打赏
  • 举报
回复
m只是个对象,并不是环境或作用域,最多只能算个命名空间。 javascript中只有函数级作用域,没有块级作用域。而m连块级作用域都不是。 m只是个对象数据类型而已,和数组[]是一样的,不要被那个大括号{}迷惑了 var m = { a: 1, b: function() { alert(this.color); } }; 完全等价于 var m = new Object(); m.a = 1; m.b = function() { alert(this.color); } 这样看看哪来的作用域啊

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧