- JS this关键字
a.面向对象语言中,this表示当前对象的一个引用,但在JS中this不是固定不变的,它会随着执行环境的改变而改变,具体如下:
1 在方法中,this表示该方法所属的对象
2 如果单独使用,this表示全局对象
3 在函数中,this表示全局对象
4 在函数中,在严格模式下,this是未定义的
5 在事件中,this表示接收事件的元素
6 类似call()和apply()方法可以将this引用到任何对象上
注意:this只有在函数调用的时候才会发生绑定,谁调用了函数,就绑定谁
b.显式函数绑定
在JS中函数也是对象,对象则有方法,apply和call就是函数对象的方法。他们允许切换函数执行的上下文环境(context),即this绑定的对象。
例子
c.关于this,分享一个我以前做过的挺有意思的一个题,:var person1 = { fullName: function() { return this.firstName + this.lastName; }; var person2 = {firstName: 'John', lastName: 'Doe'} ; person1.fullName.call(person2); //返回John Doe //就是让函数在指定对象上调用,this在调用的时候发生绑定,指向person2
我先将结果告诉你,是undefined,给你5分钟思考。//下面这段JS程序的执行结果是什么 var user = { count: 1, getCount: function() { return this.count; } } var func = user.getCount; console.log(func();
好了,我来解答:
我上面说过,this只有在函数调用的才会发生绑定,谁调用的绑定谁。那么是谁调用的这个函数呢?其实题目绕了一个弯子,它声明了一个变量接收user对象的对象方法getCount,很明显func是一个函数类型的变量,这个变量是在哪儿声明的呢?显而易见,函数外部,在函数外部声明的变量是什么?是全局变量,全局变量是属于哪个对象的?默认是属于window对象的,所以下面函数的调用func(),就等同于window.func(),这样的话,this肯定就绑定window对象了。然后我们看里面执行的代码,this.count就等同于执行window.count,这样一个语句就相当于是声明了一个变量但是没有赋值,这样的变量打印出来肯定就是undefined,如果里面this,就是执行return count,这就相当于直接使用一个没有声明的变量,程序肯定就会报错了
如果window.count没有懂,不妨看看下面这个例子:var person = { name : 'John Doe' } person.age = 10; //JS中是支持这样给一个对象添加一个属性的,这句话就是声明添加一个属性并赋值 person.sex; //这就相当于声明了一个属性不赋值 console.log(person.sex) //undefined //window对象是一个JS预先已经定义好的对象,这下懂了吧
- JS let和const
a.let声明的变量拥有块级作用域({}内)
b.const声明一个只读的常量,一旦声明,常量的值就不能改变,同样也是块级作用域
c.var声明的变量不具备块级作用域,在块内重新声明变量也会重新声明块外的变量,let不会
d.在函数体内(外)使用var和let关键字声明的变量类似,作用域都输局部(全局)的var x = 10; {var x = 2;} //x最终输出2 var y = 10; {var y = 2}; //y最终输出10
HTML代码中使用全局变量:
使用var关键字声明的全局作用域变量属于window对象
使用let关键字声明的全局作用域变量不属于window对象
e. var存在变量提升(hoisting),支持先使用后声明,let不行
f. const声明的变量必须初始化
g. const的本质:const定义的常量并非真正的常量,并非不可变,它定义了一个常量引用值。使用const定义的对象或者数组,其实是可变的,从这里我们可以得出:const声明的变量不能改变的是它的地址引用,而这个地址上的内容我们是可以修改的。比如:
const car = {type: 'Fiat', model: '500', color: 'white'};
car.color = 'red'; //这个改变时允许的,而且是可以奏效的
//car = {...}; //数组是一样的,不写了,能偷懒就偷懒
h. const不存在变量提升
-
JS JSON
a. JSON是用于存储和传输数据的格式,通常用于服务端向网页端传递数据
b. 什么是JSON,全拼是(JavaScript Object Notation) JS对象表示法
JSON是一种轻量级的数据交换个事
JSON是独立的语言
JSON易于理解
c. JSON语法规则
数据为键/值对
数据由逗号分隔
大括号保存对象
方括号保存数组
d. JS中的两个方法
JSON.parse() 将JSON字符串转成JS对象
JSON.stringify() 将JS值转成JSON字符串 -
JS void
a. JavaScript: void(0)的含义
void操作符指定要计算一个表达式但是不返回值
void(alert(‘xxx’)) //不返回值,但是括号内的表达式还是要执行
b. href = “#” 与 href = "javascript: void(0)"的区别
#包含了一个位置信息,默认的锚记是#top也就是网页的上端,而javascript:void(0)仅仅表示一个死链接 -
JS代码规范(老生常谈,一次没记)
a. 变量使用驼峰命名法
b. 通常在运算符前后添加空格
c. 4个空格缩进
d. 以分号结尾
e. 每行代码字符数小于80