重温JS——对象、函数、变量的作用域、this关键字、构造函数

目录

一、对象

二、函数

三、变量的作用域

四、this关键字

五、构造函数  


一、对象

JS中只有两种数据类型: 基本数据、引用数据(object、function)

        var obj = {
            name:"karen",  //对象内的属性
            //对象的方法:这个函数的大括号中的代码不会运行,只有调用了才会运行
            sayName:function () {
                console.log(1)
            }
        }

二、函数

函数的三种写法

        //定义一个函数:直接创建一个函数,把它当作数据一样,不会提升
        var obj= {
            say:function () {}
        }
        var a=function () {}
        var arr=[function(){},200,2]
        (function(){})

        //声明函数:直接在作用域写一个函数,会提升
        function fn () {}

        //标准的创建一个函数都西昂
        var f1=new Function("console.log(1)")
        f1()


 

采用一个内置对象Function来创建(动态函数)

var 函数名 = new Function("参数列表", "函数体"); 

        var a;
        var b=1;
        var f1 = new Function("a,b","var a=20;console.log(a,b)")  //20  und
        f1(10)

 

函数被调用一次,就会执行一次函数体中的所有代码

函数一定会有返回值,没有写return的就返回undefined。写了返回值,就是返回值。

注意:

声明一个函数:var fn = function () { }

在控制台写fn() 回车后是undefined。

如果在控制台写console.log (123),回车后会显示123  和undefined

return 后面紧跟表达式。如果紧跟后面没有写代码的话,就是一个空表达式,就生成undefined。

return一旦运行了,函数体后面的代码都不会执行了

 函数的嵌套

        function fn () {
            var a=20
            function fm(){}
            var obj={say:function(){
                console.log(obj)  //能访问到上一排的obj。但是访问不到say属性
            }}
        }

能够修饰标识符的只有两个:  var   function

实际传入函数的参数(实参)的格式可以比形参的个数多,按照顺序赋值,不会影响程序的执行逻辑,但是会影响性能。

也可以比形参的个数少,也是按顺序赋值。可能会影响程序的执行逻辑==>可以解决:就是设计函数时,提前预设

        function fn (a,b) {
            if(a==undefined){a=0}
            if(b==undefined){b={}}
        }
        fn(10,{name:"karen"})
        fn(1)

函数内部有一个关键字 arguments,代表实际传入函数的参数列表(类数组)。

函数的length属性代表的是形参的个数

函数有name属性,就是自己函数的名字

如果函数有自己的名字,那就是自己的名字(就算有变量赋值给它也是自己的名字),但如果没有自己的名字,但是有变量赋值此函数,那函数的name属性值就是变量名

       function fn() {}
        console.log(fn.name)  //fn
        var a=fn
        console.log(a.name)  //fn

        var a=function() {}
        console.log(a.name)   //a


        var a=function fn() {}
        console.log(a.name) //fn

三、变量的作用域

作用域一般是对函数来说

在ES5中,函数的代码块内部的代码,可以访问形参变量,也可以访问外部的变量(全局),就近优先。

函数外面的代码不能直接访问函数内部的变量

作用域:指一个变量它在哪些代码范围能够被使用,这些地方就是变量的作用域

局部变量就是函数内部能使用,外部不能使用的变量

        var obj = {
            name:"karen"
        }
        function fn(n) {
            n.name="jack"   //打印jack
            // n={name:"jack"}  //打印karen
        }
        fn(obj)
        console.log(obj.name)

 name先在自己的fm函数中找,如果没有,就去外面的作用域找,外面的作用域是fn和fm之间,而这之间只有一个obj,没有name,所以最后结果为没有定义报错

        function fn () {
            var obj={
                name:"karen",
                fm:function() {
                    console.log(name)   
                }
            }
        }

四、this关键字

this关键字代表了函数调用时的调用者。只需要看离他最近(嵌套)的函数的调用者

        fn()  //window
        obj.fn()   //obj
        obj.x1.x2()  //obj.x1
        (function(){})()   //window
        fn()()  //window
        fn()[1]()   //fn()返回的数组
        var f1=new fn()   //创建的新对象(可能是f1)

在脚本中代表的是window全局对象

console.log(this)

var a=20   //全局变量会在脚本执行时,把变量名设置为全局对象window的属性

function fn () {console.log(this)}   //全局函数会在脚本执 行时,把函数设置为全局对象window方法

fn()   ==>   window.fn()

        var obj={fn:function(){console.log(this)}}
        var arr=[]
        arr[0]=1
        arr[1]=obj.fn
        arr[1]()   //[1,fn]
        //匿名函数
        (function(){
            console.log(this)   //window
        })();

        function fn() {
            return function fm () {
                console.log(this)  //window
            }
        }
        fn()()   //调用者是window

打印this 的愿意:ths代表了一个对象,常常在项目中需要给一个对象操作成员

winodw有一个属性: name,它的值是 空字符串 " "   ==>    name : " "

基本数据取一个成员是可以的,但是是undefined

        function a(xx) {
            this.x=xx
            return this
        }
        var x=a(5)   //a=6
        var y=a(6)   //y=window
        console.log(x.x)   //undefined        6.x==>基本数据取一个成员是可以的,但是是undefined
        console.log(y.x)   //6                window.x=6

var a=b=c   的解释:

从右边开始,b=c;如果c是基本数据,就将其赋值给b;如果c是引用数据,就是b和c都指向/引用同一个空间。

a=b也是一样。虽然a是最后赋值(引用)的,但是a的引用声明是一开始就有了。

this 基本上就代表的是对象,在极其少的时候,this不是对象==>call、apply、bind

五、构造函数  

JS是一个基于面向对象的单线程的脚本语言

new fn()   解释:

new关键字后面跟函数,是一个表达式(运算符),创建对象的运算,整个表达式一定会得到一个对象

1、创建一个空对象  {}

2、运行构造函数,让内部的this指向创建的对象(用创建的空对象去调用构造函数) {}.fn()

3、整个表达式的结果,看函数的返回值:(可能是数组、函数.....)

      返回值是引用数据,就是返回值

      返回值不是引用数据,那么就是这个运行完毕之后的创建的那个对象

任何对象都有构造函数,任何对象都是函数创建出来的(null除外)

new  ==>后面一般跟一个函数,new会创建对象,而且会去调用这个函数

new fn==> 创建对象,然后调用函数,不传参   ==>new无参

new fn()==> 创建对象,然后调用函数,并传参   ==>new带参

        function fn() {
            this.name="karen"
            return function fm () {
                console.log("1")
                this.name="jack"
            }
        }
        var f1=new fn()
        console.log(f1.name)   //fm

        console.log(x)  //报错
        console.log(window.x)  //undefined     (原型链的知识)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值