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不能调用该方法呢??
还是window
。。。全局对象window
内部函数的 this 也绑定全局对象,这是 JavaScript 的一个缺陷,如果想绑定到其外层函数对应的对象上,可以用 that 替换,代码如下
如果不用 that 替换,输出的将是 0,如果对 this 还不够理解,可以查下 MDN
https://developer.mozilla.org...
函数调用的四种方式:
直接调用,例如
fn()
,此时函数内部的this指向全局对象(window)new构造函数,例如
new Person()
,此时函数内部的this指向将要实例化的对象作为对象方法调用,例如
obj.fn()
,此时函数内部的this指向obj使用call、apply调用,例如
fn.call(obj)
,此时函数内部的this,指向call的第一个参数(obj)你的情况属于第一种,所以this指向window
再补充一点函数作用域,如果在全局作用域中声明的函数或者变量,声明的函数或者变量属于全局对象的属性,但是在函数内声明的变量,其挂载的对象是运行函数的活动对象。
你声明的getName是在Person内,其挂载在Person的活动对象,所以通过window是无法访问到。
总结:1. 作用域是由声明时决定的 2. this,arguments等是运行时决定的
其实还是window
为什么你会认为Person(Nicholas")是被window调用呢?这里的Persin函数是直接调用,只是浏览器把this绑定到了window,在严格模式,则为undefined;那么getname()也是函数被直接调用了,不存在你说的被谁调用的问题吧