改变this指向
-
call
函数名.call(对象,原函数参数) -----修改的同时调用了函数 -
apply
函数名.apply(对象,[参数以数组形式存在] ) -----修改的同时调用了函数 -
bind
函数名.bind(对象,原函数参数) -----修改了this指向,函数没有被调用, 将会返回结果保存之后,再调用。
高阶函数
- JavaScript的函数其实都指向某个变量。
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
简单的理解就是,函数中的参数是 函数,或返回值是 函数,这种函数就是高阶函数。
函数中的成员
- arguments 凡是函数调用, 都会默认含有一个 arguments 对象. 可以将其看做为 “数组”.
- caller: 调用这个函数的函数
- length: 函数的 length 属性. 表示定义函数时, 形参的个数
- name: 函数名-----只读
- caller 表示调用函数的函数
作用域
在JS当中,只有函数才能限定作用域, 其他均不能限定访问范围。
结论:
- 在代码中只有函数可以限定作用范围. 允许函数访问外部的变量. 反之不允许.
- 在函数内优先访问内部声明的变量, 如果没有才会访问外部的.
- 所有变量的访问规则, 按照预解析规则来访问
作用域链
是用来做变量查找的. 因此变量可以存储什么东西. 链中就应该有什么东西.
预解析
代码在执行之前,需要快速的 “预览” 一遍. 会检查错误语法,也可以尽可能提高执行效率。
js 在预解析的过程中完成了声明部分的标记与变量作用域的设定。
js 中声明有两部分: 变量的声明和函数的声明
闭包
在 js 中函数是一个具有变量作用域隔离特性的一个内存结构, 即为一个闭包.
闭包解决了:在全局作用域下访问到局部变量
// 闭包模式一:函数模式,函数A中有一个函数B
function f1() {
var num=10;
function f2() {
console.log(num);
}
f2();
}
f1();
// 闭包模式二:函数模式,函数A中有一个对象B
function f3() {
var num=10;
var obj={
age:num
}
console.log(obj.age);
}
f3();
闭包的作用:缓存数据,延长作用域
闭包的优缺点:缓存数据,而缓存数据回造成内存泄露,一般能不用就不用,使用沙箱。
沙箱
沙箱就是js中一块完全独立的区域,使用的都是自己独立的属性和方法
js中沙箱的基本格式------ js中 起始就是一个 自执行函数
(function () {
})();
沙箱的使用规范
- 所有的变量定义 写在最上方
- 中间放逻辑代码
- 最后,如果需要就给外界暴露一些成员,如 window.num=num;
沙箱模式的优势
1.沙箱模式不会再外界暴露任何的全局变量,也就不会造成全局变量污染。
2.沙箱中的所有数据,都是和外界完全隔离的,外界无法对其进行修改,也就保证了代码的安全性。