찾다

 >  Q&A  >  본문

javascript - js的全局作用域和对象作用域的问题

var a = 'global';
var obj = {
	a : 'local',
	test : function(){
		function test1(){
			alert(this.a);//global
		}
		alert(this.a);//local

		test1();//所有者是window
	}
};
obj.test();

为什么第一个a弹出的值是global 它的this指向了window
是因为test1()函数的作用域属于全局作用域吗?为什么不是obj呢?

大家讲道理大家讲道理2836일 전781

모든 응답(5)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-10 12:46:57

    在Douglas Crockford的《JS语言精粹》中有讲到:

    当一个函数并非一个对象的属性时,那么他就是被当做一个函数来调用的:
    var sum = add(3,4);//add()在前面已经定义

    以此模式调用的函数,this被绑定到全局 对象。这是语言设计上的一个错误。

    所以 test1()是函数调用模式,此时的this已经是window对象了。
    可以参考this的问题

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-10 12:46:57

    方法调用的时候,会有this指针的传递
    例如:
    a.doSomething();
    那么,在doSomething这个函数域中,this指针指向的就是对象a

    如果直接调用doSomething(),那么,this指针指向的是全局对象,即window

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-10 12:46:57

    function test1(){
        alert(this.a);//global
    }

    上面格式的声明函数都是全局作用域

    test1 = function() {}
    or
    {test1 : function() {}}

    这种格式声明的函数则距具有和变量(属性)相同的作用域

    회신하다
    0
  • 阿神

    阿神2017-04-10 12:46:57

    JS中 所有的全局变量其实都是 global(浏览器就是window)对象的一个属性。
    this的引用改变只有依靠 "." 操作符或函数的".apply()"或".call()"来改变。
    全局变量(如:"var foo = 'bar';") 也可以被写成 "global.foo = 'bar';"

    회신하다
    0
  • PHPz

    PHPz2017-04-10 12:46:57

    关键字this没有作用域限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,this指向调用他的对象,如果作为函数调用,this不是全局变量就是undefined(严格模式下)

    회신하다
    0
  • 취소회신하다