- 一、|| 和 && 运算符的赋值
- 二、this关键字
- 1、全局作用域下,this指向window
- 2、函数执行的时候,看函数前边有没有 点 ,有的话,点前面是谁,this;如果没有,就是window(严格模式下为undefined)
- 3、給元素绑定事件的时候,当事件触发,函数执行时,里面的this就是当前绑定的元素
- 4、自执行函数中的this,非严格模式下指向window
- 5、回调函数里面的this指向window(严格模式下也是window)
- 6、通过 类 创造的实例,构造函数中的this指的就是当前的实例
- 7、this指向可以通过call、apply、bind改变
- 8、箭头函数中没有this,也没有arguments;但是箭头函数中用this,就去他的上级作用域去找(作用域链)
一、|| 和 && 运算符的赋值
或运算符
从左向右,哪个值为真,就取哪个值 var a = 10 || 11; // 10 var a = null || 11; // 11
且运算符
- 第一个值为假,就取第一个值;
- 第一个值为真,就取第二个值。
var b = null && 2; // null var b = 10 && 20; // 20
二、this关键字
1、全局作用域下,this指向window
function aa () {console.log(this);}
2、函数执行的时候,看函数前边有没有 点 ,有的话,点前面是谁,this;如果没有,就是window(严格模式下为undefined)
function fn(){console.log(this)}fn(); //这里的this就是window,在严格模式下就是undefinedvar obj={name:"li",fn:fn,}obj.fn(); //这里的this就是obj
3、給元素绑定事件的时候,当事件触发,函数执行时,里面的this就是当前绑定的元素
// 给元素绑定事件// ele.onclick = function () {// console.log(this);// }
4、自执行函数中的this,非严格模式下指向window
- 非严格模式下:window
- 严格模式下:undefined
// 自执行函数里的this(function () {console.log(this); // window})()
5、回调函数里面的this指向window(严格模式下也是window)
// 回调函数里面的thissetTimeout (function () {console.log(this); // window}, 1000)function fn(callback) {console.log(this);callback();}fn(function () {console.log(this); // window 严格模式下为undefined})
6、通过 类 创造的实例,构造函数中的this指的就是当前的实例
// 通过类 创建的实例,构造函数中的this指的就是当前实例function fn2() {this.name = aaa;this.age = 10;}var f1 = new fn2();var f2 = new fn2();
7、this指向可以通过call、apply、bind改变
// 利用call() 该变this指向function aa () {console.log(this);}var obj = {name : "111",age : 12}aa.call(obj);
8、箭头函数中没有this,也没有arguments;但是箭头函数中用this,就去他的上级作用域去找(作用域链)
练习题
// 练习题1let obj={name:"li",fn:(function(n){// 这里的thisconsole.log(this);return function(){// 这里的thisconsole.log(this);}})(10),}obj.fn();// 练习题2var num=10;var obj={num:20};obj.fn=(function(num){this.num=num*3; // window.num = 60num++; // 自执行函数的num = 21return function(n){this.num+=n; // window.num = 60+5 obj.num = 20+10num++; // 自执行函数的num=22 自执行函数的num=22+1console.log(num); // 自执行函数的num=22 自执行函数的num=22+1}})(obj.num);var fn=obj.fn;fn(5); // 函数执行的时候,fn()前边没有点,this指向windowobj.fn(10); // 函数执行的时候,fn()前边是obj,this指向就是objconsole.log(num, obj.num) // 65,30// 练习题3 !!var a = 1;var obj1 = {a: 0,fn1: (function (a) {this.a = a;a++;return function () {this.a = a++;console.log(a)}})(a)};obj1.fn1();var fn1 = obj1.fn1;fn1();console.log(a);console.log(obj1.a);// 练习题4var num = 1;var obj = {num: 2,fn: (function () {this.num *= 2;num += 3;var num = 1;return function () {num += 2;this.num += 2console.log(++num);}})()};var f = obj.fn;f();obj.fn();console.log(window.num, obj.num);// 练习题5var num = 10;var obj = {num: 15};obj.fn = (function (num) {this.num += 10;num *= 2;return function (n) {this.num += n;console.log(n + (--num));}})(obj.num);var fn = obj.fn;fn(10);obj.fn(15);console.log(window.num, obj.num);
练习题答案
// 练习题3var a = 1;var obj1 = {a: 0, // obj1.a = 0 ==> 2fn1: (function (a) {this.a = a; // window.a = 1a++; // 私有a = 1+1return function () {this.a = a++; // obj1.a = 私有a=2,私有a++=3; window.a = 私有a = 3,私有a++ = 4console.log(a) // 私有a = 3 ; 私有a = 4}})(a)};obj1.fn1();var fn1 = obj1.fn1;fn1();console.log(a); //3console.log(obj1.a); //2// 练习题4var num = 1;var obj = {num: 2, // obj.num = 2 ==> 4fn: (function () {// var 了私有num = undefined ==>4this.num *= 2; // window.num = 1*2num += 3; // 私有num = undefined+3var num = 1; // 私有num = 1return function () {num += 2; // 私有num = 1+2 私有num = 4 + 2this.num += 2 // window.num = 1*2 + 2 obj.num = 2+2console.log(++num); // 私有num = 1+2+1 私有num = 4+2+1}})()};var f = obj.fn;f();obj.fn();console.log(window.num, obj.num); // 4,4// 练习题5var num = 10;var obj = {num: 15};obj.fn = (function (num) {// 传入实参num = 15this.num += 10; // window.num = 10+10num *= 2; // 私有num = 15*2return function (n) {this.num += n; // window.num = 20+10 obj.num = 15+15console.log(n + (--num)); // 10+(私有num)30-1 15+(私有num)29-1}})(obj.num);var fn = obj.fn;fn(10);obj.fn(15);console.log(window.num, obj.num); // 30,30
