1.常用系统函数:
let num = 12.12;
/* let num2 = parseInt(num); */
let num2 = parseFloat(num)
/* 会把字符串12.12转换为浮点数 */
console.log(num2);
let str2 = parseFloat(12.02);
console.log(str2)
console.log(isNaN('abc'-123))/* 使用is NaN方法来判断是不是一个数字,
不过不是数字就返回true ,是数字就返回false*/
/* NaN not a number表示不是一个数字 */
练习:
function fn(){
let arr = parseFloat(prompt('请输入'));
if(isNaN(arr)){
alert('不是数字,请输入数字')
}
else {
alert(arr)
}
}
2.变量提升:
/* 变量提升 */
/* 当你下面用var的时候会出现变量提升的情况 */
/* var a = undefind,没有赋值 */
/* console.log(a)
var a = '123'; */
/* 会报错 */
/* let 不存在变量提升,不能在还没有初始化的时候使用变量
否则报错,下面的代码不会执行 */
/* console.log(a)
let a = 123 */
/* 函数是JS里面的一等公民 */
/* 声明的function会提升函数到最前面 */
/* 页面一加载的时候会先找有没有var和function如果发现有var
就会把变量预定义为undefined,如果没有发现function就会把function放最前面 */
/* fn()
function fn(){
console.log(111)
} */
/* 练习,定义一个变量再定义一个函数,变量是一个字符串,在函数打印出来 */
/* a是全局变量 */
fn()
var a = '123';
function fn(){
console.log(a)
}
变量提升练习:
<button onclick="fn()">新增学员</button>
<button onclick="nn()">显示学员信息</button>
<script>
/* 如果函数里面没有let或者var声明变量,a会变成一个全局变量 */
/* 内部声明的变量只能在函数内部调用 */
let arr= []
function fn(){
/* arr 只有定于全局才不会被重复定义 */
arr.push( prompt('请输入新增学员姓名'))
};
function nn(){
document.write('共'+arr.length+'名学员'+'信息如下'+'<br>'+arr)
}
</script>
3.变量return:
/* function fn(){
return '函数通过return将值返回调用他的地方'
} */
/* 比较两个数大写并返回'最大的数是。。。’ */
/* 匿名函数自执行 */
let str = (function (){
var a = parseInt( prompt('请输入第一个数'));
var b = parseInt( prompt('请输入第二个数'));
if(a<b){
return '第二个数最大';
}
else {
return '第一个数最大';
}
})();
alert(str)
4.作用域:
/* 全局和局部作用域 */
let a = 132;
function fn1(){
console.log(a)
}
function fn2(){
console.log(a)
}
/* window.location自带属性 */
5.作用域链:
/* 可以通过代码访问的属性和一系列进攻JS引擎访问的内部属性 */
let a = '你好'
function fn(){
a = 'hello'
document.write(a)
}
fn()
/* 作用域链 首先会在当前的作用域内去变量对应的值
如果找不到,会向上一层一层的去寻找 */
6.闭包:
/* 一个函数就可以理解为一个闭包 */
/* 函数外部无法读取函数内部数据 */
/* function f1(){
alert(1)
} */
function fn1(){
let a = 1;
/* fn2就是一个闭包 */
function fn2(){
document.write(a)
}return fn2;
}fn1()()/* console.log(fn1()) */
/* 通过这种方式就可以得到fn1局部变量a的值 */