찾다

 >  Q&A  >  본문

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

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不能调用该方法呢??

天蓬老师天蓬老师2816일 전601

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

  • 高洛峰

    高洛峰2017-04-11 12:31:44

    还是window

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-11 12:31:44

    。。。全局对象window

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-11 12:31:44

    function Person(name){
        var name=name;
        function getName(){
            console.log(this) // window
            return name;
        }
        console.log(getName());
    }
    Person("Nicholas");

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-11 12:31:44

    内部函数的 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...

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-11 12:31:44

    函数调用的四种方式:

    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等是运行时决定的

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 12:31:44

    其实还是window

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-11 12:31:44

    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()也是函数被直接调用了,不存在你说的被谁调用的问题吧

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