**
栗子:
**:
function foo() {
getName = function () {
alert(1); }
return this;
}
foo.getName = function () {
alert(2); };
foo.prototype.getName = function () {
alert(3); };
var getName = function () {
alert(4); };
function getName() {
alert(5); }
//
foo.getName(); // 2
getName(); // 4
foo().getName(); // 1 // (foo()).getName() ---> window.getName()
getName(); // 1 // 执行foo(), 被修改
new foo.getName(); // 2 // '.'点的执行优先级最高, 但'.'前遇见()会先执行()前面
//new (foo.getName)()
new foo().getName();// 3 (new foo()).getName();
// 实例对象的隐式原型 = 构造函数的显示原型
new new foo().getName(); // 3 new ((new foo()).getName)()
解析
函数提升, 变量提升
foo 函数提升, var 变量(getName)提升, getName 函数提升;
变量名和函数名冲突, 会忽略变量, 保留函数;
函数作用域
foo 函数里先从自身找 getName 的变量, 没有, 就找全局的
执行 foo 函数, 会修改全局的 getName
函数返回值
foo 函数返回值为 this , 即为 调用foo 函数的对象
理解不全面, 还望指正.