function fn() {
rank = function() {alert("虞姬")}
console.log(this);
return this
}
fn.rank = function() {alert("王昭君")}
fn.prototype.rank = function() {alert("西施")}
var rank = function() {alert("貂蝉")}
function rank() {alert('杨玉环')}
fn.rank()
rank()
fn().rank()
rank()
new fn.rank()
new fn().rank()
new new fn().rank()
某一个作用域中代码的运行流程:
形参声明/变量声明 实参赋值 函数提升 运行代码
var rank;
function fn() {
rank = function() {alert("虞姬")}
console.log(this);
return this
}
function rank() {alert('杨玉环')}
fn.rank = function() {alert("王昭君")}
fn.prototype.rank = function() {alert("西施")}
rank = function() {alert("貂蝉")}
fn.rank()//弹出王昭君
//找最近的fn.rank(): fn.rank = function() {alert("王昭君")}
rank()//弹出貂蝉
//找最近的rank函数:rank = function() {alert("貂蝉")}
fn().rank()//打印 window 弹出虞姬
//先找fn函数运行:function fn() {
// rank = function() {alert("虞姬")}
// console.log(this);
// return this
//}
//改变了rank为:rank=function() {alert("虞姬")},打印this为window,返回window,
//然后window.rank(),弹出虞姬
rank()//弹出虞姬
//rank函数改变了为:rank=function() {alert("虞姬")},所以弹出虞姬
new fn.rank()//弹出王昭君
//成员访问|new 带参 > new 无参|函数调用
//new (fn.rank) () ==> new 函数 ()
//所以弹出王昭君
new fn().rank()//弹出西施
//先进行new fn(),将rank的值改为:rank=function() {alert("虞姬")},打印this,为创造的对象fn,返回fn,
//然后对象fn没有rank方法,在原型链上找:fn.prototype.rank = function() {alert("西施")},所以弹出西施。
new new fn().rank() //弹出西施
//根据成员访问|new 带参 > new 无参|函数调用
//new ((new fn()).rank) ()
//先new fn()将rank的值改为:rank=function() {alert("虞姬")},打印this,为创造的对象fn,返回fn,
//然后对象fn没有rank方法,在原型链上找:fn.prototype.rank = function() {alert("西施")},创建对象运行,弹出西施
在调用new的过程中都发生了什么?
1.创建一个空对象 ==> 创建一个空对象{} 给它添加一个属性proto这个属性引用fn.prototye
2.运行构造函数,让内部的this指向创建的对象(用创建的空对象去调用构造函数),给创建的对象添加属性。函数内部的this就是创建的对象。
3. 整个表达式的结果看函数的返回值:
3.1返回值是引用数据 那么就是返回值
3.2返回值不是引用数据 那么就是这个运行完毕之后的创建的那个对象
this代表的是 执行这个this代码的环境对象
this基本上就代表的是对象 在及其少的时候 this不是对象=>call apply bind