前言:个人随笔,每个JavaScript开发者都需要看看小黄书上册
什么是this?
需要清楚的是,this是函数内部对象
虽然在全局当中也可以使用,但也不会有人把this当成window来使用吧
//常规
window.onload = function () {}
//??
this.onload = function () {}
//要这样写,那就得掀摊子了
onload = function () {}
此处只谈论浏览器环境
回到函数内部,函数内this又是指向谁呢
基本定义,谁调用的这个函数,那么this就指向谁
那这个谁到底是谁,绕圈了,主要是对象
那么一个函数在调用时,会是什么情况
fn();// window
function fn() {
console.log(this)
}
又是window,如果按上述说的基本定义,调用它的对象是window
不过,当一个函数内部使用的this是window时,通常代表着,这里写的不对头。非要用this表示window那只会使代码阅读性,不可描述
对于这一点,在严格模式里也体现了出来,如果函数内部this指向window,那它干脆的,给你换成undefined
那正常对象调用时又是什么样的呢
const dog = {
name: '小黑',
look: function () {
console.log(this);
}
}
dog.look();// dog
这里就显然了,一个对象调用了自己的方法,而方法内部的this指向了这个对象
为什么要使用this?
使用一样东西,要么是没得选,要么是它是一样利器
比如var
和let
以前我没得选,现在我想当个好人
而this,就是一样利器
那么this的有利点在哪,或者说不使用它会怎么样
根据场景分析
const dog1 = {
name: '小黑',
cry: function () {
console.log(dog1.name + '正在喊叫');
}
}
const dog2 = {
name: '小白',
cry: function () {
console.log(dog2.name + '正在喊叫');
}
}
dog1.cry();// 小黑正在喊叫
dog2.cry();// 小白正在喊叫
这一段着实没啥看头,写的太死,要是再加一条,又得一大段重复的
对这一点,使用函数来优化一下过程
function Dog (name) {
const obj = {};
obj.name = name;
obj.cry = function () {
console.log(obj.name + '正在喊叫');
}
return obj;
}
const dog1 = Dog('小黑');
const dog2 = Dog('小白');
const dog3 = Dog('大黄');
再优化一下对象的属性赋值,可以更精简
function Dog (name) {
const obj = {
name: name,
cry: function () {
console.log(obj.name + '正在喊叫');
}
};
return obj;
}
这时候可以想,能不能把变量obj
也给省掉,这不是最后都会返回,这个变量就显得多余
//两数相加
function add1(x, y) {
const num = x + y;
return num;
}
//完全可以
function add2(x, y) {
return x + y;
}
答案是不行,为什么?
因为cry()
需要对象的name属性,而没有对象名,就做不到这一点,这就玩不下去了
当然,可以利用函数的参数来完成这点,没问题,就是在使用方法时,还要把自己当作参数传入,虽说在生产函数内部显得简单了,但导致使用方法麻烦了很多
function Dog(name) {
return {
name: name,
cry: function (obj) {
console.log(obj.name + '正在喊叫');
}
}
}
const dog = Dog('小黑');
dog.cry(dog);
不过从这一点来看,似乎可以将属性简化一下,简化啥?函数公用
为什么要使用函数,为了就是多个地方使用同一段代码嘛,现在看一眼,发现这个函数除了输出的name不同以外,其他都是一样的
为什么说要简化,减少消耗
好比WC,是不可能做到每人单独一间,功能都是一样的,那为何不共用一下呢,当然不是说所有都能共用,而是一个例子
function Dog(name) {
return {
name: name,
cry: cry,
}
}
function cry(obj) {
console.log(obj.name + '正在喊叫');
}
const dog1 = Dog('小黑');
const dog2 = Dog('小白');
console.log(dog1.cry === dog2.cry);// true
dog1.cry(dog1);// 小黑正在喊叫
dog2.cry(dog2);// 小白正在喊叫
其实已经到了边界点了,这时候想去除这多余的参数,就得请出this
function cry() {
console.log(this.name + '正在喊叫');
}
这最佳方案便出炉了,很香,就感觉顺理成章,毫无违和感
回到主题,为什么要使用this?
使函数更精简,共用性强,阅读性高