Heim > Fragen und Antworten > Hauptteil
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不能调用该方法呢??
高洛峰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");
怪我咯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...
大家讲道理2017-04-11 12:31:44
函数调用的四种方式:
直接调用,例如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等是运行时决定的
巴扎黑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()也是函数被直接调用了,不存在你说的被谁调用的问题吧