zoukankan      html  css  js  c++  java
  • 前端逼死强迫症系列之javascript续集

    一、javascript函数

    1.普通函数 

    function func(){
    }

    2.匿名函数

    setInterval(function(){
        console.log(123);
    },5000)

    3.自执行函数

    多数情况下可能会引入别人的js,如果别人的js函数重复,会导致一个不能用,为了避免这个问题,把内部所有的功能放到函数里面。做成一个嵌套函数。

    但是如果外面的函数名也有重复,怎么处理,就外边的函数没有名字,并且自动执行一下。

    自执行函数怎么写呢?

    //  ()():第一个括号function,第二个括号传实参。创建函数,并且自动执行
    (function(arg){
        console.log(arg);
    })(1) 

    二、javascript序列化及转义

    • 常用的序列化操作
    li = [11,22,33,44]
    s = JSON.stringify(li)    // 把对象转化为字符串
    newL = JSON.parse(s)    // 把字符串转化为对象
    • 转义

    比如网上搜一个东西,网址自动变成了%等一些内容

    >  url = "https://www.sogou.com/web?query=时间"
    <  "https://www.sogou.com/web?query=时间"
    >  newUrl = encodeURI(url)                 // 转义
    <  "https://www.sogou.com/web?query=%E6%97%B6%E9%97%B4"
    >  decodeURI(newUrl)                       // 转回原格式
    <  "https://www.sogou.com/web?query=时间"
    >  newUrl = encodeURIComponent(url)        // 全部转义
    <  "https%3A%2F%2Fwww.sogou.com%2Fweb%3Fquery%3D%E6%97%B6%E9%97%B4"

    默认http请求不是长链接,连一次就断了,但是网站有保持登录一个月,怎么实现的。

    一般登录成功后,网站会给你发一段字符串过来,把它保存在硬盘的某个地方。这就是cookie。

    客户端(cookie) =》 服务器端 。 将数据经过转义后,保存在cookie

    escape( )          // 对字符串转义
    unescape( )        // 给转义字符串解码
    URIError           // 由URl的编码和解码方法抛出

    三、eval以及时间操作

    • eval

    在Python中:

    val = eval(" 1+1 ")    # 表达式
    exec(" 执行代码 ")      # 比如for循环。但exec只是执行,没有返回值

    JavaScript中:

    eval :功能是python里eval和exec的合集

    • 时间操作
    >  d = new Date()
    Mon Nov 28 2016 22:46:33 GMT+0800 (中国标准时间)
    >  d.getMinutes()
    46
    >  n = d.getMinutes() + 12
    58
    >  d.setMinutes(n)
    1480345113329
    >  d
    Mon Nov 28 2016 22:58:33 GMT+0800 (中国标准时间)
    
    //        Date类
    //        var d = new Date()   当前时间 
    //        d.getXXX  获取
    //        d.setXXX  设置

    四、javascript作用域

    1.javascript以函数作为作用域(let除外)

    • java、c、c# 等语言是以“{}”代码块 作为作用域的。
    • Python中:作用域是以函数作为作用域的。
    • JavaScript:也是以函数作为作用域的

    2.函数的作用域在函数未被调用之前,已经创建

    3.函数的作用域存在作用域链,并且也是在被调用之前创建

    作用域链:嵌套函数,作用域一层套一层

    以下三个示例,分别会输出什么?

    // 示例一:
                xo = "alex";
                function func(){
                    // var xo = 'eric';
                    function inner(){
                        // var xo = 'tony';
                        console.log(xo);
                    }
                    inner()
                }
                func()
    
            // 示例二:
                xo = "alex";
                function func(){
                    var xo = 'eric';
                    function inner(){
                        console.log(xo);
                    }
                    return inner;
                }
                var ret = func()
                ret()
    
            // 示例三:
                xo = "alex";
                function func(){
                    var xo = 'eric';
                    function inner(){
                        console.log(xo);
                    }
                    var xo = 'tony';
                    return inner;
                }
                var ret = func()
                ret()
    // 注:浏览器console中换行,使用shift+回车       

    函数的作用域存在作用域链,并且也是在被调用之前创建

    4.函数内部变量 声明提前

      // 示例一:
            function func(){
                console.log(xxoo);
            }
            func();
            // 程序直接报错
    
            function func(){
                console.log(xxoo);
                var xxoo = 'alex';
            }
            // 解释过程中:var xxoo;
            func();
            // undefined

    未赋值变量,提前声明为 undefined

    >  var fgf
    undefined
    >  fgf
    undefined

    五、javascript面向对象

    • this代指对象(python self)
    • 创建对象时, new 函数名()
    function Foo(n){
        this.name = n;
        this.sayName = function(){
            console.log(this.name);
        }
    }
    
    var obj1 = new Foo('we');
    obj1.name
    obj1.sayName()
    
    var obj2 = new Foo('wee');
    obj2.name
    obj2.sayName()

    上面那么写可以,但是有个问题,里面有些内容被重复定义了,sayName这个方法在每个对象里都被重复定义了一次。

    • Python的面向对象:方法保存在类内存中
    class Foo:
        def __init__(self,name):
            self.name = name
    
        def sayName(self):
            print(self.name)
    
    obj1 = Foo('we')
    obj2 = Foo('wee')
    • JavaScript面向对象 —> 原型:

    原型:避免浪费内存资源

    function Foo(n){
        this.name = n;
    }
    // Foo的原型
    Foo.prototype = {
        'sayName': function(){
            console.log(this.name)
        }
    }
    
    obj1 = new Foo('we');
    obj1.sayName()
    
    obj2 = new Foo('wee');

    六、javascript 词法分析解析

    如下代码,分别会对应输出什么?

     function t1(age){
                console.log(age);   // function age()
                var age = 27;
                console.log(age);   // 27
                function age(){}    // 执行时,因为没有调用,所以执行时不考虑
                console.log(age);   // 27
            }
    
            t1(3);

    active object ——> 简称AO 
    1. 形式参数 
    2. 局部变量 
    3. 函数声明表达式(优先级比较高) 


    下面开始分析:

    • 形式参数: 
      AO.age = 3;
    • 局部变量: 
      AO.age = 27;
    • 函数声明表达式 
      AO.age = function()

    作用域值的分析,也可以通过词法分析,去分析

  • 相关阅读:
    [转]window.open居中
    WebService实例一
    开发步骤
    ubuntu命令
    ubuntu如何添加软件源
    WebService学习笔记
    android.view.WindowManager$BadTokenException: Unable to add window token null is not for an application
    Dialog的使用
    区分Activity的四种加载模式
    在android 中导入项目后 包出现错误
  • 原文地址:https://www.cnblogs.com/lixiaoliuer/p/7154463.html
Copyright © 2011-2022 走看看