题目一 说出下列this指向和输出的值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var _name='global';
var obj={
func(){
const innerFunc=()=>{
console.log(this._name);
}
return innerFunc;
},
_name:'local',
};
// 语句1
obj.func()();
// 语句2
var func=obj.func;
func()();
// 语句3
obj.func.bind({_name:"newObj"})()();
// 语句4
obj.func.bind()()();
// 语句5
obj.func.bind({_name:'bindObj'}).apply({_name:'applyObj'})();
</script>
</body>
</html>
分析:语句1最里面的是箭头函数,箭头函数this和外部保持一致,箭头函数外面是对象点方法(方法es6简写),所以this指向obj
this._name的值可以看成是obj._name所以值为local,总感觉这里有些迷糊,对象点属性是这样的吗?
这里没有设计变量和函数作用域声明提升这些问题吗?
语句2 无论怎么样我都不理解,假设是把obj.func的值付给了变量func,那么变量func的值就应该为local,那为什么下面还可以调用变量啊。就算把变量func看做是声明表达式,箭头函数内部指向还是看外部,obj.func不还是指向obj吗?怎么就指向window了?
假设我把obj.func看做是一个取出来独立的函数,就可以理解为window,函数全局下值指向window,window.name值就是global
但是我总是忍不住想这个是不是和函数作用域和声明提升有关系
对了忘了说了,我不能理解为什么把一个方法赋给变量,变量还能进行调用?????,声明表达式可以调用吗?等会去看看
语句3 bind改变this指向,指向由obj变为传入的这个指向对象,值为newObj
语句4 bind没有传入自定义this的时候,null,undefined时,继续指向原来的this,不懂这样的话,值不应该是local吗?
语句5 this一旦被bind后,就不会被call和apply修改,所以值为bindObj
题目二 改一些地方让下面代码输出值
原代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 修改前
var circle = {
radius:10,
outerDiameter:function(){
var innerDiameter = function(){
console.log(this);
console.log(2 * this.radius);
};
innerDiameter();
},
};
circle.outerDiameter();
</script>
</body>
</html>
修改方法一
使用临时变量缓存this
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 修改前
var circle = {
radius:10,
outerDiameter:function(){
// 增加这一行代码,把this改为_this
var _this=this;
var innerDiameter = function(){
console.log(this,"this指向");
console.log(_this,"_this指向");
console.log(2 * _this.radius);
};
innerDiameter();
},
};
circle.outerDiameter();
</script>
</body>
</html>
修改方法二:
bind提前绑定this
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var circle = {
radius:10,
outerDiameter:function(){
var innerDiameter = function(){
console.log(this,"this指向");
console.log(2 * this.radius);
};
// 增加代码,改变了this指向
innerDiameter = innerDiameter.bind(this);
innerDiameter();
},
};
circle.outerDiameter();
</script>
</body>
</html>
修改方法三:
箭头函数,本身没有this,与外面函数this指向一致
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var circle = {
radius:10,
outerDiameter:function(){
var innerDiameter = ()=>{
console.log(2 * this.radius);
console.log(this,"this指向");
};
innerDiameter();
},
};
circle.outerDiameter();
</script>
</body>
</html>
题目三 箭头函数
题目一
思考为啥下面this的值是1,而不是2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 箭头函数中的this是不能被call apply去改变
// 奇怪,不是说call apply bind就是改变箭头函数this指向的吗?
//call 改变方法执行的主体
//生成foo实例的时候,print已经创建了
class Foo{
print = () => {
console.log(this.x);
};
constructor() {
this.x = 1;
}
}
let foo = new Foo();
foo.print.call({ x:2 });
</script>
</body>
</html>
题目二
思考下面的值为何改变了
我没听懂,不过证明了以前call没记错,不过场景要细分区别
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function printThis(){
let print = () => console.log(this);
print();
}
printThis.call([1]);
printThis.call([2]);
</script>
</body>
</html>
题目四 call apply bind
call还可以实现继承喔
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var o1 = {
number: 1,
getNumber: function (num) {
return this.number + num;
}
};
var o2 = {
number: 2,
}
console.log(o1.getNumber(2));
console.log(o1.getNumber.call(o2,2));
console.log(o1.getNumber.apply(o2,[2]));
var fn = o1.getNumber.bind(o2);
console.log((2));
// call与this,继承
// 父类
function Animal(name){
this.name = name;
this.age = 10;
}
// 子类
function Cat(name){
Animal.call(this,name);//这里用了call,继承了animal诶
this.catName = 'cat';
}
var cat = new Cat('Tom');
console.log(cat);
</script>
</body>
</html>
题目五
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function Person(name){
this.name=name;
}
var p = new Person("kevin");
console.log(p.name);
// 假设把这个构造函数当成是一个普通的函数
Person("kate");
console.log(window.name);
</script>
</body>
</html>
题目六
经典的我觉得在对象方法里的声明表达式this指向全局
我果然觉得这个和变量提升很像啊,怎样区分是变量还是this呢?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var value = 10;
var obj = {
value: 100,
method: function() {
var foo = function() {
console.log(this.value);
console.log(this);
}
foo();
return this.value;
}
}
// 函数特性就是调用一遍就执行一遍
obj.method();
var c = obj.method();
console.log(c,"obj.method");
</script>
</body>
</html>
题目七
我又不懂了,我以为function里面的number都是30,结果是两个都是20,然后函数下面我以为会是30,结果是10,然后我以为最后一个number会是10的时候,结果是20,难道是我又把var那里的知识忘了,需要重新复习
对了,忘了这是csdn,不是hbuildex,不会显示第几行
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var number = 10;
function Person(){
// 全局变量number覆写
number = 20;
// 增加实例变量
this.number = 30;
console.log(number);
console.log(window.number);
}
console.log(number);
Person.prototype.getNumber = function(){
console.log(this.number);
return this.number;
}
var p = new Person();
console.log(p.getNumber());
console.log(number);
</script>
</body>
</html>
题目八
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function getName(){
console.log(this.name);
}
getName();
</script>
</body>
</html>
题目九
看this.id值两次调用的不同
它们在玩一个很新的东西
第二个题关于参数的问题是这样的,函数的实参传值需要形参来接受,但是这个off()函数没有形参,然后它执行了这个函数,this指向全局,值为undefined可以理解吗?变量声明未赋值值为undefined。如果不注释掉var war=33,输出值就为33
call还可以这样用,震惊----不对,call本来就是改变this指向的啊
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var id=66;
function fn5(){
setTimeout(()=>{
console.log(this.id)
})
}
fn5({id:22})
fn5.call({id:22});
// 函数参数我也懵了,?????
// var war=33;
function off(){
setTimeout(()=>{
console.log(this.war)
})
}
off({war:11})
</script>
</body>
</html>
题目十
use strict 下this指向undefined
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function a(){
function b(){
console.log(this);
function c(){
"use strict";
console.log(this);
}
c();
}
b();
}
a();
</script>
</body>
</html>
题目十一
最后一个是小红没懂
听也听不懂
不对,不对,是我搞混了,这个speacial不是独立的
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name = "小白";
function special(){
console.log('姓名:' + this.name);
}
var girl = {
name:"小红",
detail: function(){
console.log("姓名:" + this.name);
},
woman: {
name: "小黄",
detail: function(){
console.log("姓名:" + this.name);
},
},
special: special,
}
girl.detail();
girl.woman.detail();
girl.special();
</script>
</body>
</html>
题目十二
第一段代码写了我看见代码的第一反应和想法,大家可以看下面的代码
下面那五个才是执行啊,也对函数要调用才能执行
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name = "小红";
function a(){
var name = "小白";
console.log(this.name);
}
function d(i){
return i();
}
var b = {
name: "小黄",
detail: function (){
console.log(this.name);
},
bibi: function(){
return function(){
console.log(this.name);
};
},
}
var c = b.detail;//小黄
b.a = a;//小红,但是b哪里来的a,b一个对象怎么点a啊
var e = b.bibi();//bibi-this指向b,但是return这里function是不是指向window呢?还是指向bibi
a();//函数a指向全局,值为小红 √
c();//小黄,执行过程跟之前也一模一样 ×小红
b.a();//对象可以直接执行另一个函数??小黄 √
d(b.detai);//返回小黄 ×小红
e();//小黄或者小红 答案是小红
</script>
</body>
</html>
var c=b.detail 对他进行调用结果为小红,但是b.detail单独执行就是小黄。
好了,恭喜我晕了又不懂了,特别是和题目六联动以后,这两个题逻辑好像是反的
不对劲,题目六好像两个值是一个this.value,一个是return value值,奇怪
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name = "小红";
function a(){
var name = "小白";
console.log(this.name);
}
function d(i){
return i();
}
var b = {
name: "小黄",
detail: function (){
console.log(this.name);
},
bibi: function(){
return function(){
console.log(this.name);
};
},
}
var c = b.detail;
b.a = a;
var e = b.bibi();
a();
c();
b.a();
d(b.detail);
e();
</script>
</body>
</html>
题目十三
13.1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function print() {
console.log(this);
}
let obj = {
a: 1,
b: 2,
};
obj.print = print;//没有这句就要报错
obj.print();
</script>
</body>
</html>
13.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function print() {
console.log(this);//obj.o
}
let obj = {
a: 1,
b: 2,
o: { }
};
obj.o.print = print;
obj.o.print();
</script>
</body>
</html>
13.3
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
let print = () => {
console.log(this);//window
}
let obj = {
a: 1,
b: 2,
};
obj.print = print;
obj.print();
</script>
</body>
</html>
13.4
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function print () {
console.log(this);
}
let obj = {
a: 1,
b: 2,
};
let o = {
c: 3,
}
obj.print = print;
obj.print.call(o);
</script>
</body>
</html>
13.5
let preson= 是在构造实例 person(大可爱)是在把它当函数调用 第三个是在输出name的值
注意return的值 {}值是undefined 123值是小可爱,基本数据类型值都是小可爱
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function Person(name) {
this.name = name;
console.log(this);
// return {};
// return 123;
}
let person = new Person("小可爱");
Person("大可爱");
console.log(person.name);
</script>
</body>
</html>
13.6
不懂
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 这种还是闭包
function print() {
return function () {
console.log(this);//window
}
}
let obj = {
a: 1,
b: 2
};
obj.print = print;
obj.print()();
</script>
</body>
</html>
13.7
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 这种还是闭包
function outer() {
let obj = {
inner: function () {
console.log(this); //obj
}
}
obj.inner();
}
let obj = {
a: 1,
b: 2
};
obj.outer = outer;
obj.outer();
</script>
</body>
</html>
13.8
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 这种还是闭包
Window.name = "window han";
let obj = {
name : "cute",
outer: function(){
this.name = "cool";
function inner () {
console.log(this);//windwo
}
return inner;
}
};
obj.outer()();
</script>
</body>
</html>
13.9
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 这种还是闭包
Window.name = "window cute";
let obj = {
name : "cool",
outer: function(){
this.name = "chain";
function inner () {
this.name = "confirm"
function innerInner () {
console.log(this.name);//inner
}
return innerInner;
}
return inner;
}
};
obj.outer()()();
</script>
</body>
</html>
13.10
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function print() {
let that = this;
return function () {
console.log(that);//obj
}
}
let obj = {
a: 1,
b: 2
};
obj.print = print;
obj.print()();
</script>
</body>
</html>
题目十四
不懂,没懂为什么要说类
14.1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 类的本质是一个函数
class Test {
test () {
console.log(this);
}
}
const test = new Test();
test.test();
</script>
</body>
</html>
14.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 类的本质是一个函数
class Test {
constructor () {
// 类的非静态方法会在实例化(new)的过程中添加到this中
this.test = function () {
// 非静态方法,在construction中添加的都是非静态方法
console.log('none-static:' + this);
}
}
// 这个是静态方法(原型上的静态属性),它是本身在定义中就放到了Test.prototype{...}
// 原型链过程 new this->{}->_proto_->Test.prototype{test}->_proto_->...->Object.prototype
test () {
console.log('statci' + this);
}
}
const test = new Test();
test.test();
</script>
</body>
</html>
14.3
这个不是练习题,讲了一下class类 ,虽然不懂为什么要讲这个
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
class Father {
constructor() {
this.age = 44;
}
swim () {
console.log('go swimming');
}
}
class Son extends Father {
// constructor又是干什么的 20221213
constructor () {
// super 调用了father上的constuctor ,生成this的绑定->father this ,内部指向了(->)Son的实例
// 等于new指向了new father,new father生成了一个对象 this->new Father()->{};
super();
this.body = 'traval';
console.log(this.age);
}
study () {
// 晕,这样可以打印的话,super是干什么的来着 20221213
this.swim();
}
}
const son = new Son();
son.study();
</script>
</body>
</html>
14.4
bind只能生效一次
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a: 1
}
var obj2={
a:100
}
var a = 2;
function test (b,c) {
console.log(this.a,b,c);
}
// bind只生效一次
var t = test.bind(obj2,3,4).bind(obj,3,4);
t();
</script>
</body>
</html>
14.5
注意:一般情况下use strict下值为undefined,箭头函数下是全局
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
'use strict';
const test = () =>{
console.log(this);
}
function test1() {
console.log(this);
}
const test2 = function () {
console.log(this);
}
test();
test1();
test2();
</script>
</body>
</html>
14.6
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
}
obj.test = () => {
console.log(obj);
console.log(this);//this指向window
}
obj.test();
</script>
</body>
</html>
14.7
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
}
obj.test = function () {
var t = () => {
console.log(this);//this指向obj
}
t();
}
obj.test();
</script>
</body>
</html>
14.8
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
}
obj.test = function () {
setTimeout(()=>{
console.log(this);//指向obj
},0)
}
obj.test();
</script>
</body>
</html>
14.9
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
}
obj.test = function () {
var t1 = ()=>{
var t2 = () => {
console.log(this);//指向obj
}
t2();
}
t1();
}
obj.test();
</script>
</body>
</html>
14.10
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
}
obj.test = function () {
var t1 = function(){
var t2 = () => {
console.log(this);//指向window
}
t2();
}
t1();
}
obj.test();
</script>
</body>
</html>
14.11
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1,
b:2,
test:function () {
console.log(this.a);
},
c:{
d:4,
test3:function() {
console.log(this);//this->obj.c 也就是this指向obj.c
console.log(this.d);//4
}
}
}
obj.c.test3();
</script>
</body>
</html>
14.12
这里的function t是一个孤立的成员,不是object的成员,最近的就是window
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1,
b:2,
test3:function() {
function t () {
console.log(this);//this->window
}
t();
}
}
obj.test3();
</script>
</body>
</html>
14.13
好麻烦,老师的结果为3,或者改动后为undefined,没有NaN的结果,我是哪里敲的不一样啊啊啊啊啊
我需要全部重敲一遍,对下结果
我说呢,老师的后面有重新给a值,b值,我真的醉了
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1,
b:2,
test3:function() {
function t () {
console.log(this);//this->window
}
t();
}
}
obj.test3();
// 注意:__proto的__按键需要敲两下
obj.__proto__ = {
e:20
}
console.log(obj.e);//20
var obj3 = Object.create({
test4: function() {
console.log(this,"obj3");//{}
console.log(this.a + this.b);//NaN
}
})
obj3.test4();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1,
b:2,
test:function() {
console.log(this.a);
}
}
obj.test();
var obj3 = Object.create({
test4: function() {
console.log(this,"obj3");
console.log(this.a + this.b);//3
}
})
// 就是下面两行代码
obj3.a=1;
obj3.b=2;
obj3.test4();
</script>
</body>
</html>
14.14
我觉得这一部分应该放到对象里去,不懂为什么将这一部分
构造函数里默认隐式返回this,或者手动返回this,这个this指向的新对象构造都是成功的
如果手动返回了一个新对象,this指向的新对象的构造是失败的
如果手动返回了一个新对象,this指向对象就被忽略了
上面三句话我的大脑都不理解哈哈哈哈哈
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 字面量方式定义对象
// function Object (){}
var obj = {
a:1,
b:2
}
console.log(obj);
// Object.create
var obj2 = Object.create({
c:3,
d:4
})
console.log(obj2);
// 这种创造出来的没链
var obj3 = Object.create(null);
obj3.a = 1,
obj3.b = 2;
console.log(obj3,"obj3");
// Object.defineProperty();
// 它可以拦截值和设置值
var obj4 = {};
Object.defineProperty(obj4,'a',{
get:function () {
console.log('I have money');
console.log(this);//this->obj4
}
})
obj4.a;
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 构造函数
// 第一种this->实例化对象
//过程 this->{} ,找到a/b属性并赋值,再隐式返回出去(就是不用把return写出来)
function Test () {
this.a = 1;
this.b = 2;
console.log(this);
}
new Test();
// 把return写出来,结果一样
function Cute(){
this.a = 1;
this.b = 2;
console.log(this);
return this;
}
new Cute();
// 把return 写出来,并重新赋值
function Cool(){
this.a = 1;
this.b = 2;
console.log(this);
return {
c:3,
d:4
};
}
// 这里写出来,结果就不一样了
// new Cool();
var cool = new Cool();
console.log(cool);
var cool2 = Cool();
console.log(cool2);
</script>
</body>
</html>
14.15 重要应用好生看看
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<!-- <button id="J_btn">test</button> -->
<button id="btn1">+</button>
<script>
// test按钮
// var OBtn = document.getElementById('J_btn');
// 事件处理函数内部的this指向被绑定的DOM元素
// OBtn.onclick = function () {
// console.log(this);
// }
// OBtn.addEventListener('click',function() {
// console.log(this);
// },false)
// +号按钮
;(function(doc){
var btn1 = doc.getElementById("btn1");
function Plus(a,b){
this.a = a;
this.b = b;
this.init();
}
Plus.prototype.init = function() {
this.bindEvent()
}
Plus.prototype.bindEvent = function () {
btn1.addEventListener('click',this.handleBtnClick,false)
}
Plus.prototype.handleBtnClick = function() {
console.log(this.a + this.b);
// 为了明白为什么结果为NaN,打印一下this
console.log(this.a,this.b);
console.log(this);
}
window.Plus = Plus;
})(document);
new Plus(3,4);//结果为NaN
</script>
</body>
</html>
方法一
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<button id="btn1">+</button>
<script>
// +号按钮
;(function(doc){
var btn1 = doc.getElementById("btn1");
function Plus(a,b){
this.a = a;
this.b = b;
this.init();
}
Plus.prototype.init = function() {
this.bindEvent()
}
// 使用bind改变this指向
Plus.prototype.bindEvent = function () {
btn1.addEventListener('click',this.handleBtnClick.bind(this),false)
}
Plus.prototype.handleBtnClick = function() {
console.log(this.a + this.b,"加的和");
// 为了明白为什么结果为NaN,打印一下this
console.log(this.a,this.b);
console.log(this);
}
window.Plus = Plus;
})(document);
new Plus(3,4);//结果为NaN
</script>
</body>
</html>
方法二
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<button id="btn1">+</button>
<script>
// +号按钮
;(function(doc){
var btn1 = doc.getElementById("btn1");
function Plus(a,b){
this.a = a;
this.b = b;
this.init();
}
Plus.prototype.init = function() {
this.bindEvent()
}
// 使用_self
Plus.prototype.bindEvent = function () {
var _self = this;
btn1.addEventListener('click',function(){
_self.handleBtnClick();
},false)
}
Plus.prototype.handleBtnClick = function() {
console.log(this.a + this.b,);
}
window.Plus = Plus;
})(document);
new Plus(3,4);
</script>
</body>
</html>
14.16
看下两个图的区别
请复习复习类
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
class Father {
// 让函数内部的this指向固定值
constructor () {
this.eat = this.eat.bind(this);
}
get fruit () {
return 'apple';
}
eat () {
console.log("我要吃" + this.fruit);
}
}
class Son {
get fruit () {
return 'pear';
}
}
const father = new Father();
const son = new Son();
father.eat();
son.eat = father.eat;
son.eat();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
class Father {
// 让函数内部的this指向固定值
constructor () {
this.eat = this.eat.bind(this);
}
get fruit () {
return 'apple';
}
eat () {
console.log("我要吃" + this.fruit);
}
}
class Son {
get fruit () {
return 'pear';
}
}
const father = new Father();
const son = new Son();
father.eat();
son.eat = father.eat;
son.eat();
</script>
</body>
</html>
题目十五
15.1
这里我不懂了,箭头函数外部不是obj吗?所以指向obj,为啥外部是window了
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
let obj = {
a:1,
show:()=>{
console.log(this);
}
}
obj.show();
</script>
</body>
</html>
15.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 构造函数
function People(name,age) {
this.name = name;
this.age = age;
}
let kevin = new People("kevin",16);
console.log(kevin);
// 构造函数return 1
function Cute(act,make){
this.act = act;
this.make = make;
return 1
}
let Alan = new Cute('draw',"singer");
console.log(Alan);
//构造函数return 对象
function Greet(name,cover){
this.name = name;
this.cover = cover;
return {
a:1,
b:2
}
}
let Lucia = new Greet("Lucia","notebook");
console.log(Lucia);
</script>
</body>
</html>
题目十六
函数独立调用指向window
16.1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:2,
foo:function(){
console.log(this);
function test(){
console.log(this,"Test");
}
// 好神奇,这个test写在obj.foo下面会报错
test();
}
}
obj.foo();
</script>
</body>
</html>
16.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:2,
foo:function(){
console.log(this);
(function(){
console.log(this,"()");
})()
}
}
obj.foo();
</script>
</body>
</html>
16.3
跟this相比,我更好奇这个代码 return 函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:2,
foo:function(){
console.log(this);
function test(){
console.log(this);
}
// 返回test本身,要让它执行,在加一个()
return test;
}
}
obj.foo()();
</script>
</body>
</html>
16.4
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo(){
console.log(this);
}
var obj = {
a:2,
foo:foo
}
// 1
obj.foo();
// 2
// 赋值完后没有执行(执行是obj.foo),等于直接把foo给了bar,bar再执行
// var bar =foo 等效
var bar = obj.foo;
bar();
// 3
// bar1()再这样写会报错
var bar1 = obj.foo();
</script>
</body>
</html>
16.5
这是人写的代码?我平时学习的时候也没有看见过这种代码啊!!!!!!!!!
代码阅读理解
bar()执行,然后把obj.foo当成实参,bar(fn)里的fn当成形参,如果把obj.fun替换fn(),值就是window,因为obj.foo没有执行,就等于独立调用了函数,值就是window
但是我不懂,obj.fun替换fn(),fn()后面不是本身就有一个()吗?有括号就执行了啊
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//
var a = 0;
function foo(){
console.log(this);
}
function bar(fn){
fn();
}
var obj = {
a:2,
foo:foo
}
bar(obj.foo)
bar(obj.foo)
//下面代码值——>obj ,但是fn is not a function,why???
//bar(obj.foo())
</script>
</body>
</html>
16.6
为什么有4个windwo值,是因为循环吗?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//父函数决定子函数的this
var arr = [1,2,3]
arr.forEach(function(item,idx,arr){
console.log(this);
})
arr.sort(function(a,b){
console.log(this);
return a-b
})
// 这个也是window,会一直加载,不设置停止时间
// setInterval(function(){
// console.log(this);
// })
</script>
</body>
</html>
16.7
new绑定优先级最高,显示绑定call,bind/apply次之,然后是隐式绑定,然后是默认绑定
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var obj = {
a:1
};
// 指向window
// (function(){
// console.log(this);
// })()
// 指向obj
(function(){
console.log(this);
}).call(obj)
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function Person(){
this.a = 1;
// 一般都不这样做
return {};
}
var person = new Person();
console.log(person);
</script>
</body>
</html>
16.8 一种应用做题·,说下两个值是多少
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name = "222";
var a = {
name:'111',
say:function() {
console.log(this.name);
}
}
var fun = a.say;
fun ();
a.say();
</script>
</body>
</html>
16.9
看不懂这段代码,这段代码在我这就是一个错误,一个乱码
obj1.a是怎样成功执行的???? 那里来的a,a不是函数里的吗???
2_箭头函数的this&this的优先级_哔哩哔哩_bilibili 14分钟那里讲这个
我没有学过这样用的函数啊啊啊啊啊啊啊啊
这个题还可以看优先级
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function foo(b){
this.a = b;
}
var obj1 = {};
var bar = foo.bind(obj1);
bar(2);
console.log(obj1.a);//?
var baz = new bar(3);
console.log(obj1.a);//?
console.log(baz.a);//?
</script>
</body>
</html>
16.10 重要应用
翻车指南值得拥有
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
// 为什么这里都是window,我记得that应该指向
var that = this;
function test(){
console.log(this,"this");
console.log(that,"that");
}
test();
}
foo();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
var that = this;
function test(){
console.log(this,"this");
console.log(that,"that");
}
test();
}
var obj = {
a:1,
foo:foo
}
obj.foo();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
var that = this;
function test(){
console.log(this,"this");
console.log(that,"that");
}
test.call(this);
}
var obj = {
a:1,
foo:foo
}
obj.foo();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
var that = this;
//使用箭头函数来达到目的
var test = () => {
console.log(this,"this");
console.log(that,"that");
}
test();
}
var obj = {
a:1,
foo:foo
}
obj.foo();
</script>
</body>
</html>
16.11
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
var that = this;
var test = () => {
console.log(this);
}
return test;
}
var obj = {
a:1,
foo:foo
}
var obj2 = {
a:2,
foo:foo
}
obj.foo()();//指向obj
</script>
</body>
</html>
16.12
记牢,call/apply/bind无法改变箭头函数的this指向,总是容易把它们记成改变箭头函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var a = 0;
function foo () {
var that = this;
var test = () => {
console.log(this);
}
return test;
}
var obj = {
a:1,
foo:foo
}
var obj2 = {
a:2,
foo:foo
}
var bar =foo().call(obj2);
</script>
</body>
</html>
16.13箭头函数不能作为构造函数使用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var foo = () =>{
console.log(this);
}
new foo();
</script>
</body>
</html>
16.14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name ="window";
var obj1 = {
name:"1",
fn1:function () {
console.log(this.name);
},
fn2:()=>console.log(this.name),
fn3:function() {
return function () {
console.log(this.name);
}
},
fn4:function() {
return () => console.log(this.name);
}
}
var obj2 = {
name:'2',
}
obj1.fn1();//1
obj1.fn1.call(obj2);//2
obj1.fn2();//1---错了,箭头函数的父是window,对象没有作用域
obj1.fn2.call(obj2);//2---错了,window 箭头函数call这些没用啊啊啊啊啊
obj1.fn3()();//window
obj1.fn3().call(obj2);//2
obj1.fn3.call(obj2)();//2--错了,window ,最里面的是自调用
obj1.fn4()();//1---对了,但是为什么这里的父又是obj了,之前有个不是window吗?,这里外面是一个函数,有作用域
obj1.fn4().call(obj2);//2--错了,1,父对象是obj,箭头函数不生效啊啊,记住好吗
obj1.fn4.call(obj2)();//2
</script>
</body>
</html>
16.15
不懂
第一个是构造函数上的getName,2
第二个全局上的getName,被覆盖了,所以是4
第三个 return this,独立调用,是全局window,然后前面有个没var的getName,重写了,所有结果为1
第四个全局为1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function Foo(){
getName = function () {
console.log(1);
}
return this;
}
Foo.getName = function () {
console.log (2);
};
Foo.prototype.getName = function () {
console.log (3);
};
var getName = function () {
console.log (4);
};
function getName() {
console.log (5);
};
Foo.getName();//2
getName();//这里几个getName,我怎么知道它说的是哪个
Foo().getName();
getName();
</script>
</body>
</html>
题目17
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var name='hammer';
var obj={
name:"小王",
func1:function(){
console.log(this.name)
},
func2:function(){
setTimeout(function(){
this.func1()
}.apply(obj),100);
}
}
obj.func2()
</script>
</body>
</html>
题目18
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<button>按钮</button>
<script>
let btns=document.getElementsByTagName('button')
for(var btn of btns){
btn.onclick=function(){
console.log(this)
}
}
</script>
</body>
</html>