字符串方法:
var str = ' abcdedf ';
console.log(str.trim());//去除字符串两侧的空格符
函数进阶
函数的定义
//1.命名函数
function fn (){ }
//2.匿名函数 变量接收
var fn = function(){ } fn()
//3.自调用函数
(function(){ })()
//4.创建对象
var fn = new Function('字符串格式参数',"字符串格式执行代码")
new Function()
函数的调用方式
函数定义:命名函数,匿名函数
调用函数:
1.普通函数 【fn()】
2.对象的方法【对象.方法()】
3.构造函数【new Fn()】
4.绑定事件函数【obj.onclick = function () { }】
5. 定时器函数【window.setInterval(function(){ },1000)】
6. 立即执行函数【(function(){ }()】
改变函数内部this指向
JavaScript为我们专门提供了一些函数方法来帮助我们来处理函数内部的this的指向问题。
call方法
call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this指向。
fun.call(thisArg,arg1,arg2)
第一个参数:this指向谁就写谁;
后面的参数:函数本身常规的参数
当我们想改变this指向,同时想调用这个函数的时候,可以使用call,比如继承
apply 方法
fn.apply(obj,["aaa","bbb"]);
apply的第一个参数和call一样
后面的参数必须是数组
//利用apply改变Math.max的this指向 求数组最大值:
var arr = [11,22,33,44,66]
var n = Math.max.apply(arr,arr)
bind() 方法
既想改变this 又不想调用函数,就要用bind()
fn.bind(thisArg,arg1,arg2)//改变this指向,但不会执行函数
三种方法总结
相同点:都可以改变函数内部的this 的指向。
区别点:
1.call 和apply 会调用函数,并且改变函数内部this指向。
2.call 和apply传递的参数不一样,call传递参数aru1,aru2..形式apply必须数组形式[arg]
3.bind 不会调用函数,可以改变函数内部的this指向
主要应用场景:
1.call 经常做继承。
2. apply 经常跟数组有关系。比如借助于数学对象实现数组最大值最小值
3.bind 不调用函数,但是还是想改变this指向,比如改变定时器的内部this 指向
严格模式
JS:两种模式[类似于HTML版本]
1、正常模式
2、严格模式
JavaScript 除了提供正常模式外,还提供了严格模式(strictmode)。ES5 的严格模式是采用具有限制性JavaScript 变体的一种方式,即在严格的条件下运行JS 代码。
严格模式在IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。
严格模式对正常的JavaScript 语义做了一些更改:
1.消除了Javascript语法的一些不合理、不严谨之处,减少了一些怪异行为。【例如变量,不声明就报错】
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的Javascript做好铺垫。比如一些保留字如:class, enum, export, extends, import, super 不能做变量名
开启严格模式
开启严格模式:“use strict”
<script>"use strict"</script>//脚本开启严格模式
<script>function fn () {"use strict"}</script>//为函数开启严格模式
严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。
为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句“use strict”;(或‘use strict’;)。
<script>
"use strict";
console.log("这是严格模式。");
</script>
因为"use strict"加了引号,所以老版本的浏览器会把它当作一行普通字符串而忽略。
为函数开启严格模式
function fn(){"use strict";return "这是严格模式。";}
将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。
严格模式中的变化
严格模式对Javascript的语法和行为,都做了一些改变。
变量规定
变量申明必须加var,而且不准删除变量
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var命令声明,然后再使用。
n = 3;
严禁删除已经声明变量。例如,delete x; 语法是错误的。
严格模式下this 指向问题
严格模式下,普通函数this是undefined
以前在全局作用域函数中的this 指向window 对象。
严格模式下全局作用域中函数中的this是undefined。
其他的没有变化:
以前构造函数时不加new也可以调用,当普通函数,this 指向全局对象
严格模式下,如果构造函数不加new调用, this 指向的是undefined 如果给他赋值则会报错
new 实例化的构造函数指向创建的对象实例。
定时器this 还是指向window 。
事件、对象还是指向调用者。
函数变化
参数不能重名
函数必须声明在顶层.新版本的JavaScript 会引入“块级作用域”(ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。【if,for等里面定义函数也不可以,但是现在不可以】
更多严格模式要求参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
错误写法:
function fn (a,a) {console.log(a+a);}
fn(1,2);
高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
- 把函数当做参数的函数叫做 高阶函数,参数叫回调函数
- 把函数当返回值的函数,也叫高阶函数
作用域
变量根据作用域的不同分为两种:全局变量和局部变量。
1. 函数内部可以使用全局变量。
2. 函数外部不可以使用局部变量。
3. 当函数执行完毕,本作用域内的局部变量会销毁。
闭包
闭包作用:有权访问另一个函数作用域中变量的函数。
闭包(closure):简单理解就是,一个作用域有权访问另外一个函数内的局部变量,即使是在父函数关闭之后。
<script>
function fn1(){
// fn1 就是闭包函数
var num = 10;
function fn2(){
console.log(num); // 10
}
fn2()
}
fn1();
</script>
思考:如何再函数外面访问到函数内部的变量
function fn () {
var i = 7;
return function () {
console.log(i);
}
// function fn1 () {
// console.log(i);
// }
// fn1();
}
var n = fn();
n();
函数的递归
什么是递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
函数调用其本身,调用容易发生“栈溢出”错误(stack overflow),所以要用return
function fn(){
fn()
return;//此处必须把函数推出
}
fn()/
注意点:1.递归点 2.停止递归点