一、系统函数
1.
parseInt(numString,[radix]),numstring 是需要转换的字符串,radix是2-36之间的数字,代表需要转换的数的进制数。
注意:如果numstring无法转换成数字,则返回NaN(非数字)
//如果字符串中开头是数字,只会转换开头数字其他非数字不会转换,不是数字开头的字符串返回NaN
let str1 = '10abc';
let s1 = parseInt(str1);
console.log(s1); //--->10
//这里radix值是2,代表需要转换的字符1010是2进制数,那么依然返回的是十进制数10
let str1 = '1010';
let s1 = parseInt(str1, 2);
console.log(s1); //--->10
2.parseFlaot() 将字符串转换成浮点型的数字
3.isNaN(),用于检查其参数是否是非数字,如果是非数字返回true,是数字返回false
tips:if()判断条件中,0 == false ; ''(空字符串)== false ; null ==false ;
二、自定义函数
函数一般都需要return返回值,使用return时,如果没有返回值,那么直接终止函数,有返回值的情况下,会把返回值返回给调用函数的地方。
1.全局变量:在函数外声明的变量,网页上的所有脚本都可以访问到,它的生命周期在页面关闭后销毁。
2.局部变量:在函数内部声明的变量,只有函数内部才能访问,函数外部无法访问到。局部变量的生命周期在函数执行以后就销毁。
注意:局部变量在声明时,必须定义变量(使用var/let/const关键字),如果不定义变量,直接赋值,那么直接赋值的变量是全局变量。
3.作用域
全局作用域是指在全局定义的变量,所有的脚本都可以访问到
局部作用域是指在局部定义的变量,只有函数内部(局部代码块)能范文,局部以外的地方不可以访问
tips:所有的window对象的属性都拥有全局作用域,
如:window.name ; window.location ; window.top ;window.alert ; window.prompt等;
4.作用域链:遵循就近原则,逐层往外寻找可访问的匹配的变量,找到就调用,不在往外继续寻找。
5.闭包
闭包简单理解就是代码中的内部函数,闭包函数可以读取其他函数内部的变量。使得在其他函数外部可以访问读取其内部变量。
闭包将函数内部和函数外部连接起来。
函数内部的变量被内部函数所引用,导致变量在内存中销毁不了,所以函数外部可以通过闭包的方法进行访问内部函数的变量。
闭包的用途:
-
可以读取访问函数内部的变量;
-
让这些变量的值一致保存在内存中。
function f1() {
var num = 0;
function f2() {
num = num + 2;
alert(num);
}
return f2;
}
let f = f1();
f();
f();
f();
闭包的缺点:
(1)由于闭包使得函数内部的变量一直保存在内存中,当保存的不可销毁回收的数据太多时,容易造成内存泄露,造成网页性能出现问题。
(2)闭包会在父函数外部改变父函数的内部的变量的值
6.预解析
浏览在执行代码之前会对整个代码进行预解析;
预解析阶段会对var 定义的变量进行提升,对函数进行提升。这也就是为什么我们将函数调用代码写在函数之前依然可以执行的原因。
/* 浏览器在预解析时,会对var对象进行变量提升, */
console.log(str) //--->undefined
var str = '123';
//函数在预解析时,也会进行提升
fn();
function fn() {
console.log(123);
}
//
fn(); //---->这里报错
var fn = function () {
console.log(123);
}
//报错原因:预解析过程:1.var fn ;会先预解析变量的定义,即var fn;
// 2.代码顺序会变为 :var fn;--->fn();--->赋值 fn = function(){console.log(123)}
// 3.此时依次执行的时候,fn变量,没有被定义成函数,出现报错。
//let 和const定义的变量不会进行变量提升
console.log(str2);
let str2 = '123';