首先var定义的变量或者直接在全局作用域声明的函数,都是存在windows中的
而 ES6中的let和const声明的变量和方法是单独生成一个块来保存的
建议使用let,const来声明。避免污染全局windows的方法和属性
函数执行期上下文
function text(a,b) {console.log(a)c = 0var ca = 5b = 6conole.log(b)function b() {}function d() {}console.log(b)}text(1)// 创建AO = {a = undefined > 1 > 5b = undefined > function b() {} > 6c = undefined > 0d = function d() {}}// 输出 1,6,6// 首先找到函数中的变量,然后将实参定义形参及函数,然后是赋值
函数的arguments获取实参,length获取行参的个数
function text(a,b,c){console.log(text.arguments) //已堆的形式存储【1,2,3】}text(1,2,3)
函数的优化=>箭头函数
let array = [1,2,3,4,5,6].filter(function(value, index) {return value >= 3})let array = [1,2,3,4,5,6].filter(value=> value >= 3)
首先将function函数去掉使用=>箭头 , 如果函数参数为一个可以去掉(),如果表达式为一行可以将return去掉,默认return。
函数中this
const obj = {name: 'qihuanran',fun() {console.log(this.name) // qihuanranfunction nes() {console.log(this.name) // undefined}}}obj.fun()
当函数以对象属性的形式出现时、this指向当前的对象。不以对象属性出现时this指向window。
如果想让函数nes指向对象,可以在nes外部定义let This = this因为外部的this指向当前对象。
函数递归
就是函数调用自己
function text(n){return text(n) * 1}consloe.log(text(4)) // 4
