JavaScript部分知识点总结
文章目录
window.onload的作用
页面中的代码一般情况下都是执行上下文,从上到下,从左到右执行
写在head标签里面的script可以在window.onload方法里面,浏览器在页面加载完成之后在执行script代码
js导入的位置
<head></head>之间
页面在加载时会先加载js文件
<body></body>之间
js需要操作dom的时候需要采用这种方式,否则,js需要操作dom的时候dom还没有生成,会出现问题。
</body></html>之间
浏览器会先加载dom元素,然后读取js内容
重要的文件写在<head></head>之间,次要的写在</body></html>之间
DOCTYPE
DOCTYPE是document type(文档类型)的简写,在web设计中用来声明文档类型。
不是html标签,也没有结束标签,它是一种标记语言的文档类型声明,告诉浏览器当前html的用什么版本编写的。
回调函数
回调:机制是通过指针来调用函数
回调函数就是传递一个参数化的函数,就是将这个函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行传进去的作为参数的函数。
通俗的讲:被作为参数传递到另一个函数(主函数)的那个函数就是回调函数
this指向问题
- 全局作用域或者普通函数中this指向全局对象window,定时器里面的this也指向window
- 方法调用中谁调用this指向谁
- 构造函数中this指向构造函数的实例
数组的声明方式
//第一种
var arr = new Array();
arr[0] = 123
arr[1] = "abc";
arr[5] = false;
alert(arr[3]);//undefined
alert(arr);//123,abc,,,,false
alert(arr[10]);//undefined,不会出现越界异常
//第二种
var arr = new Array(2);//长度为2的数组
arr[0] = 'ddd';
arr[1] = 'www';
console.log(arr);//ddd,www
arr[2] = 'fff';//可以再次添加元素,定义的数组大小对此没有影响
console.log(arr);//ddd,www,fff
//第三种
var arr = new Array(1,2,false);
console.log(arr);//1,2,false
//第四种
var arr =['a','b','c'];
console.log(arr);//a,b,c
变量提升
var 声明的变量会自动提升到作用域的前端
栗子
function test(){
console.log(a);//undefined
var a = 10;
}
test();
上述代码执行顺序如下
function test(){
var a;//声明的a提升到test函数作用域的最前端
console.log(a);//10
a = 10;
}
test();
函数提升
javascript中不仅仅是变量声明有提升的现象,函数的声明也是一样;具名函数的声明有两种方式:
- 函数声明式 2. 函数字面量式
//函数声明式
function bar () {}
//函数字面量式
var foo = function () {}
函数字面量式的声明合变量提升的结果是一样的,函数只是一个具体的值;
但是函数声明式的提升现象和变量提升略有不同
闭包、变量提升、作用域链
1.js中变量作用域:全局变量和局部变量
- 全局变量可以在函数内部被访问
- 函数内部的局部变量不可以在函数外被访问
- 在函数内部声明变量时,一定要用var声明,否则就是全部变量
2.闭包
有权访问另一个函数作用域中变量的函数;被内部函数访问的变量可以保存在外部函数的作用域中而不被回收
用途:
- 在函数外部读取函数内部的局部变量(沿着作用域链寻找)
- 变量的值始终保持在内存中
闭包只能取得包含函数中任何变量的最后一个值,即包含函数执行完毕时变量的值
3.变量提升
因为JavaScript是一种先编译再执行的语句,所以,会把var a=1;拆分成两个部分,即 var a;和 a = 1;所有的变量都会在该范围内(作用域)的前面进行声明,当运行到具体步骤时在进行赋值。
只要函数内定义了一个局部变量,函数在解析的时候都会将这个变量“提前声明”
4.作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。