关于内部函数调用对象的问题

夏友人的耕耘
  • 134
function Person(name){
    var name=name;
    function getName(){
        return name;
    }
    getName();
}
Person("Nicholas");
在全局作用域中,调用Person("Nicholas")对象是window,那么在Person函数的内部,
调用getName()函数的对象该是谁呢???

补充:
 function Person(name){
    var name=name;
    function getName(){
        alert(name);
    }
    window.getName();//window.getName is not a function 
}
Person("Nicholas");

在这段代码中,我用window调用getName()方法,会报错!window.getName is not afunction ???这是否能够说明,window不能调用该方法呢??

回复
阅读 2.7k
7 个回答

。。。全局对象window

夫子哂你妹
  • 4
新手上路,请多包涵
function Person(name){
    var name=name;
    function getName(){
        console.log(this) // window
        return name;
    }
    console.log(getName());
}
Person("Nicholas");

内部函数的 this 也绑定全局对象,这是 JavaScript 的一个缺陷,如果想绑定到其外层函数对应的对象上,可以用 that 替换,代码如下

    var point = {
      x : 0,
      moveTo : function(x) {
        var that = this;
        var moveX = function(x) {
          that.x = x;
        };
        moveX(x);
      }
    };
    point.moveTo(1);
    console.log(point.x); // 1

如果不用 that 替换,输出的将是 0,如果对 this 还不够理解,可以查下 MDN
https://developer.mozilla.org...

函数调用的四种方式:

  1. 直接调用,例如fn(),此时函数内部的this指向全局对象(window)

  2. new构造函数,例如new Person(),此时函数内部的this指向将要实例化的对象

  3. 作为对象方法调用,例如obj.fn(),此时函数内部的this指向obj

  4. 使用call、apply调用,例如fn.call(obj),此时函数内部的this,指向call的第一个参数(obj)

你的情况属于第一种,所以this指向window

再补充一点函数作用域,如果在全局作用域中声明的函数或者变量,声明的函数或者变量属于全局对象的属性,但是在函数内声明的变量,其挂载的对象是运行函数的活动对象。

你声明的getName是在Person内,其挂载在Person的活动对象,所以通过window是无法访问到。

总结:1. 作用域是由声明时决定的 2. this,arguments等是运行时决定的

其实还是window

function Person(name){
    var name=name;
    function getName(){
        return name;
    }
    getName();
}
Person("Nicholas");
在全局作用域中,调用Person("Nicholas")对象是window,那么在Person函数的内部,
调用getName()函数的对象该是谁呢???

为什么你会认为Person(Nicholas")是被window调用呢?这里的Persin函数是直接调用,只是浏览器把this绑定到了window,在严格模式,则为undefined;那么getname()也是函数被直接调用了,不存在你说的被谁调用的问题吧

宣传栏