@GivenCui
2016-05-25T19:14:26.000000Z
字数 2229
阅读 707
js高级
在JS中,所有函数都运行在某个运行环境中,对于JS而言,一切皆对象,运行环境也是对象,所以函数中的this关键字的指向,也是根据当前对象(运行环境)而定的.
// this关键字的举例
// 在构造函数中,this指向的就是该构造函数所创建的实例对象.
function Person () {
this.name = "abc";
}
var person1 = new Person();
person1.name = "bcd";
console.log(person1.name); // bcd
var person2 = new Person();
console.log(person2.name); // abc
// this自动找到实例对象的指针,可以理解为已经关联好了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>强大的this</title>
<script type = "text/javascript">
// this在这种运行环境中,就代表当前点击的按钮对象
function btnClick (ele){
alert(ele.value); // 谁点就指向谁
}
</script>
</head>
<body>
<input type = "button" value = "这是一个按钮" onclick="btnClick(this);" />
<input type = "button" value = "这是另一个按钮" onclick="btnClick(this);" />
</body>
</html>
在JS中,因为JS是动态脚本语言,运行环境是动态切换的,即this关键字的指向也是跟着动态切换的.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>this随环境动态切换</title>
</head>
<body>
<script type = "text/javascript">
function fn () {
console.log(this.name)
}
// 创建一个字面量对象 ( JSON )
var a = {
name : "a",
aFn : fn // 是个对象
}
// 再创建一个字面量函数
var b = {
name : "b";
bFn : fn // 是个对象,也指向fn
}
// 提现了根据环境动态切换
a.aFn(); // a
b.bFn(); // b
</script>
</body>
</html>
全局环境中this指向的是最顶端的window对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script type = "text/javascript">
// 1. this的全局环境指向window
console.log(this === window); // true
</script>
</head>
<body>
</body>
</html>
构造函数中this指向的是该构造函数所创建的实例对象
// this在构造函数中
function(){
this.name = "张飞";
}
Person.prototype.say = function () {
console.log (this.name);
}
// 创建一个实例
var person = new Person();
person.say(); // 张飞
如果某个对象的方法指向了另外一个对象的某个方法,那么方法内部的this指向也会发生变化.
// 对象方法中
// 用字面量方式创建的对象
// a有name属性和aFn方法
var a = {
name : "a",
aFn : function () {
alert(this.name)
// alert(a.name) // 字面量可以这么写
}
}
var b = {
name : "b",
// 为什么是b呢????
// bFn : a.aFn 是取了地址指向了b所以b调用
// 如何改成 bFn : a.aFn()
// 是指把a.aFn()的返回值给了bFn;
// 有函数()就是调用的函数
/*
bFn : a.aFn // b
*/
/*
bFn : function () {
a.aFn() // a
}
*/
}
如果某个对象的层次机构很深,我们想把某个方法提取出来,不要直接去提取方法,而是提取方法所在的对象.
// json的多层嵌套
// c对象中有d对象
var c = {
d : {
name : "刘a",
fn : function () {
console.log(this.name);
console.log(this === window);
}
}
}
// 提取fn函数,目的为了简化开发
/*
// 提取出来了(这么提取不对)
var myfn = c.d.fn; // myfn是个全局变量,存的只是地址
// 这么提取的话,函数内部的this指向变成了window对象
// 因为myfn是一个全局变量
myfn(); // undefined true
*/
// 正确的提取方法
// 如果想把fn函数提取出来,而且this指针不改变的话,那么就提取fn函数所在的对象
var myObj = c.d; // myObj是个对象
myObj.fn1(); // 刘