js高级 一些笔记

121 阅读2分钟

1.this

任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window

所有函数内部都有一个变量this

this的值就是调用函数的当前对象。那么如何确定this指向呢?

  1. 以函数的形式调用时,this永远都是window
  2. 以方法的形式调用时,this就是调用方法的对象
  3. 以构造函数的形式调用时,this就是新创建的对象
  4. 使用call和apply调用时,this就是指定的那个对象
  5. 在全局作用域中this代表window

2.不加 ; 会有问题的情况

  会导致上下行解析出问题的5个token [(+-/  这5种之前需要加分号。

小括号开头 中括号开头的前一条语句 其他几种可能是正则什么的

3.数据类型及判断

6种数据类型:

基本(值)类型:Number,String,Boolean,undefined,null

对象(引用)类型:Object

判断数据类型:

typeof :

可以区别:数值,字符串,布尔值,undefined,function

不能区别:null与对线,一般对象与数组

instanceof:专门用来判断对象数据类型:Object,Array,Function

可以判断undefined和null

4. 数据,变量,内存三者是什么以及他们之间的关系

image.png

image.png

image.png

image.png

5. js判断数据类型

1. typeof判断

除function外所有引用类型和null 返回 object 其他返回各自数据类型。number,string,undefined,boolean

2. Object.prototype.toString.call() 完美判断所有

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

3. A instanceof B 判断A是否是属于B的实例

6. 执行上下文 练习题目

`
console.log('gb:'+ i)
var i = 1
foo(1)
function foo(i){
        if(i == 4){ return }
        console.log('f begin'+ i)
        foo(i+1)
        console.log('f end'+ i)
}
console.log('gb:'+i)
//答案:
// gb:undefined
// f begin1
// f begin2
// f begin3
// f end3
// f end2
// f end1
// gb:1
    `
    

image.png

7. 变量提升和函数提升的题目

`
//先执行变量提升 再执行函数提升
 function a(){}
 var a
 console.log(typeof a); //function 后执行的函数提升所以覆盖了前者

//-----------------------

 var c = 1
 function c(c){
     console.log(c)
 }
 c(2)  
 //答案:报错 c is not a function
 //解析:先执行变量提升,后执行函数提升,然后执行变量赋值。所以最后c是1 不能执行
 
*/
//先执行的变量提升,因此window.b是存在的 b in window true
// if(!(b in window)){
//     var b;
// }
// console.log(b) //undefined

if(!(b in window)){
    var b = 1
}
console.log(b) //undefined

if(!(b in window)){
   b = 1
}
console.log(b) //报错 b is not defined
   //作用域的面试题
    var x = 10
    function fn(){
        console.log(x)
    }
    
    function show(f){
        var x =11
        f()
    }
    show(fn)

    var fn = function(){
        console.log(fn)
    }
    fn()



`

8. 闭包

image.png