Node.js相關(guān)知識

一、你不知道的JavaScript

1翻伺、作用域

作用域 LHS RHS

  • RHS查詢與簡單地查找某個變量的值別無二致靠抑,而LHS查詢則是試圖找到變量的容器本身,從而可以對其賦值黍檩。從這個角度說,RHS并不是真正意義上的“賦值操作的右側(cè)”始锚,更準(zhǔn)確地說是“非左側(cè)”刽酱。RHS理解成retrieve his source value(取到它的源值),這意味著“得到某某的值”瞧捌。
  • 非嚴(yán)格模式下棵里,當(dāng)引擎執(zhí)行LHS查詢時润文,如果在頂層(全局作用域)中也無法找到目標(biāo)變量,全局作用域中就會創(chuàng)建一個具有該名稱的變量殿怜,并將其返還給引擎典蝌。嚴(yán)格模式下則會拋出異常未聲明ReferenceError,另外還有typeError
  • 提升: 引擎會在解釋JavaScript代碼之前首先對其進行編譯头谜。編譯階段中的一部分工作就是找到所有的聲明骏掀,并用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來。當(dāng)你看到var a = 2;時柱告,可能會認(rèn)為這是一個聲明截驮。但JavaScript實際上會將其看成兩個聲明:var a;a = 2;。第一個定義聲明是在編譯階段進行的际度。第二個賦值聲明會被留在原地等待執(zhí)行階段葵袭。只有聲明本身會被提升,而賦值或其他運行邏輯會留在原地乖菱。函數(shù)聲明的提升高于變量聲明坡锡。
  • 匿名函數(shù) (function(args){})(args)
  • varlet,let關(guān)鍵字可以將變量綁定到所在的任意作用域中(通常是{ .. }內(nèi)部)窒所。換句話說鹉勒,let為其聲明的變量隱式地劫持了所在的塊作用域。let只能運行在嚴(yán)格模式下墩新。
    var foo = true;
    
    if (foo) {
        let bar = foo * 2;
        bar = something( bar ); 
        console.log( bar );
    }
    
    console.log( bar ); 
    // 因為let 贸弥, 對于用let聲明的bar,if(){}變成一個塊作用域海渊,所以在外部引用bar 時, 未聲明哲鸳,不存在變量   ReferenceError
    
    
    var foo = true;
    if (foo) {
        var a = 2;
        const b = 3; // 包含在if中的塊作用域常量
    
        a = 3; // 正常!
        b = 4; // 錯誤!
    }
    console.log( a ); // 3
    console.log( b ); // ReferenceError!
     //const同樣會劫持塊作用域臣疑,b在外部引用就是未聲明,var聲明的a則不存在劫持塊作用域徙菠,const定義變量值不可改變
    

2讯沈、閉包

  • 把內(nèi)部函數(shù)baz傳遞給bar,當(dāng)調(diào)用這個內(nèi)部函數(shù)時(現(xiàn)在叫作fn)婿奔,它涵蓋的foo()內(nèi)部作用域的閉包就可以觀察到了缺狠,因為它能夠訪問a。

    function foo() {
        var a = 2;
    
        function baz() {
            console.log( a ); // 2
        }
    
        bar( baz );
    }
    
    function bar(fn) {
        fn(); // 媽媽快看呀萍摊,這就是閉包挤茄!
    }
    
    //間接傳遞函數(shù)
    var fn;
    function foo() {
       var a = 2;
    
       function baz() {
            console.log( a );
       }
    
      fn = baz; // 將baz分配給全局變量
    }
    
    function bar() {
        fn(); // 媽媽快看呀,這就是閉包冰木!
    }
    foo();
    bar(); // 2
    
    //  jquery example
    function setupBot(name, selector) {
      $( selector ).click( function activator() {
          console.log( "Activating:" + name );
      } );
    }
    
    setupBot( "Closure Bot 1", "#bot_1" );
    setupBot( "Closure Bot 2", "#bot_2" );
    
  • 雖然以下段代碼可以正常工作穷劈,但嚴(yán)格來講它并不是閉包笼恰。為什么?因為函數(shù)(示例代碼中的IIFE)并不是在它本身的詞法作用域以外執(zhí)行的歇终。它在定義時所在的作用域中執(zhí)行(而外部作用域社证,也就是全局作用域也持有a)。a是通過普通的詞法作用域查找而非閉包被發(fā)現(xiàn)的评凝。

    var a = 2;
    
    (function IIFE() {
        console.log( a );
    })();
    
  • 循環(huán)中的閉包

    for (var i=1; i<=5; i++) {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    }
    //運行時會以每秒一次的頻率輸出五次6
    // for循環(huán)每次迭代并沒有創(chuàng)建一個新的作用域
    
    
    for (var i=1; i<=5; i++) {
        (function() {
            setTimeout( function timer() {
                console.log( i );
            }, i*1000 );
        })();
    }
    // 不行追葡,雖然每次迭代立即執(zhí)行函數(shù)創(chuàng)建新的作用域,但是一個空作用域奕短,不包含i
    
    for (var i=1; i<=5; i++) {
      (function(j) {
          // 或則  var j = i;
          setTimeout( function timer() {
              console.log( j );
          }, j*1000 );
      })( i );
    }
    // 每秒一次宜肉,輸出1~5 , 每次迭代篡诽,變量i當(dāng)前值賦予函數(shù)的參數(shù) j 并被封裝到函數(shù)作用域中崖飘。
    
    
    // let劫持塊作用域,這樣for每次迭代對let聲明的i 都是一個新的塊作用域
    for (let i=1; i<=5; i++) {
      setTimeout( function timer() {
          console.log( i );
      }, i*1000 );
    }
    
  • 模塊杈女,如下代碼:CoolModule()只是一個函數(shù)朱浴,必須要通過調(diào)用它來創(chuàng)建一個模塊實例。如果不執(zhí)行外部函數(shù)达椰,內(nèi)部作用域和閉包都無法被創(chuàng)建翰蠢。CoolModule()返回一個用對象字面量語法{ key: value, ... }來表示的對象。這個返回的對象中含有對內(nèi)部函數(shù)而不是內(nèi)部數(shù)據(jù)變量的引用啰劲。我們保持內(nèi)部數(shù)據(jù)變量是隱藏且私有的狀態(tài)梁沧。可以將這個對象類型的返回值看作本質(zhì)上是模塊的公共API蝇裤。這個對象類型的返回值最終被賦值給外部的變量foo廷支,然后就可以通過它來訪問API中的屬性方法,比如foo.doSomething()栓辜。

    function CoolModule() {
        var something = "cool"; 
        var another = [1, 2, 3];
    
        function doSomething() { 
            console.log( something );
        }
    
        function doAnother() {
            console.log( another.join( " ! " ) );
        }
    
        return {
            doSomething: doSomething, 
            doAnother: doAnother
        };
    }
    
    var foo = CoolModule(); 
    
    foo.doSomething(); // cool
    foo.doAnother(); // 1 ! 2 ! 3
    
     //我們將模塊函數(shù)轉(zhuǎn)換成了IIFE(參見第3章)恋拍,立即調(diào)用這個函數(shù)并將返回值直接賦值給單例的模塊實例標(biāo)識符foo。
    var foo = (function CoolModule() { 
      var something = "cool";
      var another = [1, 2, 3];
    
        function doSomething() { 
           console.log( something );
        }
    
        function doAnother() {
            console.log( another.join( " ! " ) );
        }
    
        return {
            doSomething: doSomething, 
            doAnother: doAnother
        };
    })();
    
    foo.doSomething(); // cool 
    foo.doAnother(); // 1 ! 2 ! 3
    
    //模塊也是普通的函數(shù)藕甩,因此可以接受參數(shù)
    function CoolModule(id) {
        function identify() {
            console.log( id );
        }
    
        return {
            identify: identify
        };
    }
    var foo1 = CoolModule( "foo 1" ); 
    var foo2 = CoolModule( "foo 2" );
    
    foo1.identify(); // "foo 1"
    foo2.identify(); // "foo 2"
    
    //模塊模式另一個簡單但強大的用法是命名將要作為公共API返回的對象
    var foo = (function CoolModule(id) {
        function change() {
            // 修改公共API
            publicAPI.identify = identify2;
        }
    
        function identify1() { 
            console.log( id );
        }
    
        function identify2() {
            console.log( id.toUpperCase() );
        }
    
    
        var publicAPI = { 
            change: change,
            identify: identify1
        };
    
        return publicAPI;
    })( "foo module" );
    
    foo.identify(); // foo module
    foo.change();
    foo.identify(); // FOO MODULE
    
  • 現(xiàn)代的模塊機制

    var MyModules = (function Manager() {
       var modules = {};
    
       function define(name, deps, impl) {
           for (var i=0; i<deps.length; i++) {
               deps[i] = modules[deps[i]];
           }
           modules[name] = impl.apply( impl, deps );
           // apply函數(shù) 繼承施敢,deps作為參數(shù)傳入,此處為函數(shù)依賴的其他函數(shù)
       }
       function get(name) {
           return modules[name];
       }
       return {
           define: define,
           get: get
       };
    })();
    //這段代碼的核心是modules[name] = impl.apply(impl, deps)狭莱。
    //為了模塊的定義引入了包裝函數(shù)(可以傳入任何依賴)僵娃,并且將返回值,也就是模塊的API腋妙,儲存在一個根據(jù)名字來管理的模塊列表中
    
    
    MyModules.define( "bar", [], function() {
       function hello(who) {
           return "Let me introduce: " + who;
       }
    
       return {
           hello: hello
       };
    } );
    
    MyModules.define( "foo", ["bar"], function(bar) {
       var hungry = "hippo";
    
       function awesome() {
           console.log( bar.hello( hungry ).toUpperCase() );
       }
    
       return {
           awesome: awesome
       };
    } );
    
    var bar = MyModules.get( "bar" );
    var foo = MyModules.get( "foo" );
    
    console.log(
       bar.hello( "hippo" )
    ); // <i>Let me introduce: hippo</i>
    
    foo.awesome(); // LET ME INTRODUCE: HIPPO
    
  • ES6模塊機制 默怨, ES6的模塊沒有“行內(nèi)”格式,必須被定義在獨立的文件中(一個文件一個模塊)辉阶。瀏覽器或引擎有一個默認(rèn)的“模塊加載器”(可以被重載先壕,但這遠(yuǎn)超出了我們的討論范圍)可以在導(dǎo)入模塊時同步地加載模塊文件瘩扼。

    //bar.js
     function hello(who) {
        return "Let me introduce: " + who;
     }
    
    export hello;
    
    //foo.js
    // 僅從"bar"模塊導(dǎo)入hello()
    import hello from "bar";
    var hungry = "hippo";
    function awesome() {
        console.log(
            hello( hungry ).toUpperCase()
        );
    }
    export awesome;
    

    import可以將一個模塊中的一個或多個API導(dǎo)入到當(dāng)前作用域中,并分別綁定在一個變量上(在我
    們的例子里是hello)垃僚。module會將整個模塊的API導(dǎo)入并綁定到一個變量上(在我們的例子里是
    foo和bar)集绰。export會將當(dāng)前模塊的一個標(biāo)識符(變量、函數(shù))導(dǎo)出為公共API谆棺。

當(dāng)函數(shù)可以記住并訪問所在的詞法作用域栽燕,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時就產(chǎn)生了閉包改淑。

3碍岔、 動態(tài)作用域

  • 事實上JavaScript并不具有動態(tài)作用域。它只有詞法作用域朵夏,簡單明了蔼啦。但是this機制某種程度上很像動態(tài)作用域。
     function foo() {
        console.log( a ); // 2
    }
    
    function bar() {
        var a = 3;
        foo();
    }
    
    var a = 2;
    
    bar();
    // foo中的a 會通過RHS查詢到全局的a仰猖,基于詞法作用域查找
    // 詞法作用域最重要的特征是它的定義過程發(fā)生在代碼的書寫階段
    // 如果基于動態(tài)作用域捏肢,作用域鏈?zhǔn)腔谡{(diào)用棧的,即foo向上查找bar中的a
    
    主要區(qū)別:詞法作用域是在寫代碼或者說定義時確定的饥侵,而動態(tài)作用域是在運行時確定的鸵赫。(this也是!)詞法作用域關(guān)注函數(shù)在何處聲明躏升,而動態(tài)作用域關(guān)注函數(shù)從何處調(diào)用

4辩棒、 this

對this的認(rèn)識,this既不指向函數(shù)自身也不指向函數(shù)的詞法作用域膨疏,拋開以前錯誤的假設(shè)和理解一睁。this實際上是在函數(shù)被調(diào)用時發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用佃却。
1卖局、 this并不像我們所想的那樣指向函數(shù)本身
2、this在任何情況下都不指向函數(shù)的詞法作用域双霍。

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log( this.a );
}

foo(); // ReferenceError: a is not defined

this是在運行時進行綁定的,并不是在編寫時綁定批销,它的上下文取決于函數(shù)調(diào)用時的各種條件洒闸。this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方式均芽。

  • 綁定規(guī)則
    • 1丘逸、默認(rèn)綁定,當(dāng)調(diào)用foo()時掀宋,this.a被解析成了全局變量a深纲。為什么仲锄?因為在本例中,函數(shù)調(diào)用時應(yīng)用了this的默認(rèn)綁定湃鹊,因此this指向全局對象儒喊。foo()是直接使用不帶任何修飾的函數(shù)引用進行調(diào)用的,因此只能使用默認(rèn)綁定币呵,無法應(yīng)用其他規(guī)則怀愧。如果使用嚴(yán)格模式(strict mode),則不能將全局對象用于默認(rèn)綁定余赢,因此this會綁定到undefined
      function foo() { 
          // "use strict"; 嚴(yán)格模式
          console.log( this.a );
      }
      
      var a = 2;
      
      foo(); // 2
      
    • 2芯义、隱式綁定,如下妻柒,調(diào)用位置會使用obj上下文來引用函數(shù)扛拨,因此你可以說函數(shù)被調(diào)用時obj對象“擁有”或者“包含”它。當(dāng)foo()被調(diào)用時举塔,它的前面確實加上了對obj的引用绑警。當(dāng)函數(shù)引用有上下文對象時,隱式綁定規(guī)則會把函數(shù)調(diào)用中的this綁定到這個上下文對象啤贩。因為調(diào)用foo()時this被綁定到obj待秃,因此this.a和obj.a是一樣的。對象屬性引用鏈中只有上一層或者說最后一層在調(diào)用位置中起作用痹屹,如obj1.obj2.foo();foo()this指向obj2章郁。隱式綁定時,我們必須在一個對象內(nèi)部包含一個指向函數(shù)的屬性志衍,并通過這個屬性間接引用函數(shù)暖庄,從而把this間接(隱式)綁定到這個對象上。
      function foo() { 
          console.log( this.a );
      }
      
      var obj = { 
          a: 2,
          foo: foo 
      };
      
      obj.foo(); // 2
      
      如下代碼楼肪,雖然bar是obj.foo的一個引用培廓,但是實際上,它引用的是foo函數(shù)本身春叫,因此此時的bar()其實是一個不帶任何修飾的函數(shù)調(diào)用肩钠,因此應(yīng)用了默認(rèn)綁定。
      function foo() { 
          console.log( this.a );
      }
      
      var obj = { 
          a: 2,
          foo: foo 
      };
      
      var bar = obj.foo; // 函數(shù)別名暂殖!
      var a = "oops, global"; // a是全局對象的屬性
      
      bar(); // "oops, global
      
      參數(shù)傳遞其實就是一種隱式賦值价匠,因此我們傳入函數(shù)時也會被隱式賦值程储,fn = obj.foo
      function foo() { 
          console.log( this.a );
      }
      
      function doFoo(fn) {
          // fn其實引用的是foo
      
          fn(); // <-- 調(diào)用位置蜈缤!
      }
      
      var obj = { 
          a: 2,
          foo: foo 
      };
      
      var a = "oops, global"; // a是全局對象的屬性
      
      doFoo( obj.foo ); // "oops, global"
      
      //js的內(nèi)置函數(shù)一樣,將函數(shù)傳遞給另一函數(shù)的形參帜羊,其中包含了隱式賦值
      function foo() { 
          console.log( this.a );
      }
      
      var obj = { 
          a: 2,
          foo: foo 
      };
      
      var a = "oops, global"; // a是全局對象的屬性
      
      setTimeout( obj.foo, 100 ); // "oops, global"
      
      
      //JavaScript環(huán)境中內(nèi)置的setTimeout()函數(shù)實現(xiàn)和下面的偽代碼類似
      function setTimeout(fn,delay) {
          // 等待delay毫秒
          fn(); // <-- 調(diào)用位置晨横!
      }
      
    • 顯示綁定洋腮,通過call()apply()函數(shù)實現(xiàn)箫柳,它們的第一個參數(shù)是一個對象,是給this準(zhǔn)備的啥供,接著在調(diào)用函數(shù)時將其綁定到this悯恍。因為你可以直接指定this的綁定對象,因此我們稱之為顯式綁定滤灯。
      function foo() { 
          console.log( this.a );
      }
      
      var obj = { 
          a:2
      };
      //顯示指定foo函數(shù)中的this并執(zhí)行該函數(shù)
      foo.call( obj ); // 2
      
      
      //硬綁定坪稽,是一種非常常用的模式,所以ES5提供了內(nèi)置的方法Function.prototype.bind鳞骤,它的用法如下
      function foo(something) { 
          console.log( this.a, something ); 
          return this.a + something;
      }
      
      var obj = { 
          a:2
      };
      
      var bar = foo.bind( obj );//將foo函數(shù)的this綁定到obj,返回一個新的foo函數(shù)實例bar
      
      var b = bar( 3 ); // 2 3 
      console.log( b ); // 5
      
      
      //第三方庫的許多函數(shù)窒百,以及JavaScript語言和宿主環(huán)境中許多新的內(nèi)置函數(shù),都提供了一個可選的參數(shù)豫尽,
      //通常被稱為“上下文”(context)篙梢,其作用和bind(..)一樣,確保你的回調(diào)函數(shù)使用指定的this美旧。
      function foo(el) { 
          console.log( el, this.id );
      }
      
      var obj = {
          id: "awesome"
      };
      
      // 調(diào)用foo(..)時把this綁定到obj
      [1, 2, 3].forEach( foo, obj );
      // 1 awesome 2 awesome 3 awesome
      //這些函數(shù)實際上就是通過call(..)或者apply(..)實現(xiàn)了顯式綁定渤滞,這樣你可以少寫一些代碼。
      
    • new 綁定
      function foo(a) { 
          this.a = a;
      } 
      
      var bar = new foo(2);
      //new foo(2)執(zhí)行時 foo的this指向new新建的對象foo
      //若不用new直接執(zhí)行foo()榴嗅,其this指向全局作用域妄呕,同默認(rèn)規(guī)則 
      
      console.log( bar.a ); // 2
      
      // 使用new來調(diào)用函數(shù),或者說發(fā)生構(gòu)造函數(shù)調(diào)用時嗽测,會自動執(zhí)行下面的操作
      //1. 創(chuàng)建(或者說構(gòu)造)一個全新的對象绪励。
      //2. 這個新對象會被執(zhí)行[[Prototype]]連接。
      //3. 這個新對象會綁定到函數(shù)調(diào)用的this唠粥。
      //4. 如果函數(shù)沒有返回其他對象疏魏,那么new表達(dá)式中的函數(shù)調(diào)用會自動返回這個新對象。
      
      //new foo(2)創(chuàng)建一個全新的foo對象晤愧,this指向的就是foo對象大莫,返回foo
      
  • 胖箭頭=>,箭頭函數(shù)不使用this的四種標(biāo)準(zhǔn)規(guī)則官份,而是根據(jù)外層(函數(shù)或者全局)作用域來決定this只厘。箭頭函數(shù)的綁定無法被修改。
    function foo() { 
        setTimeout(() => {
            // 這里的this在詞法上繼承自foo()
            console.log( this.a ); 
        },100);
    }
    
    var obj = { 
        a:2
    };
    
    foo.call( obj ); // 2
    

5舅巷、對象

  • 語法懈凹,聲明

    var myObj = {
        key: value
        // ...
    };
    
    var myObj = new Object();
    myObj.key = value;
    
  • 對象類型

    // 對象是JavaScript的基礎(chǔ)。在JavaScript中一共有六種主要類型悄谐,基本類型(術(shù)語是“語言類型”):
    string
    number
    boolean
    null
    undefined
    object
    //基本類型按照值傳遞
    
    //內(nèi)置對象
    String
    Number
    Boolean
    Object
    Function
    Array
    Date
    RegExp
    Error
    
  • 值傳遞,基本類型按照值傳遞库北,對象其實也是按值傳遞爬舰。js的基礎(chǔ)類型原始值存儲在棧中们陆,對象存儲在堆中,堆地址不能直接訪問情屹,所有棧中存儲它的地址坪仇,引用值是存儲棧中的指向堆的地址。參考https://www.zhihu.com/question/27114726/answer/35481766

    var obj = {x : 1};
    function foo(o) {
        o = 100;
    }
    foo(obj);
    console.log(obj.x); // 仍然是1, obj并未被修改為100.
    
    
    //
    var obj1 = {
      value:'111'
    };
    var obj2 = {
      value:'222'
    };
    function changeStuff(obj){
      obj.value = '333';
      obj = obj2;
      return obj.value;
    }
    
    var foo = changeStuff(obj1);
    
    console.log(foo);// '222' 參數(shù)obj指向了新的對象obj2
    console.log(obj1.value);//'333'
    
    
  • ES6增加了可計算屬性名垃你,可以將對象的key用變量表示椅文,即對變量加上[]

    var prefix = "foo";
    var a="bar"
    
    var myObject = {
        [a]: "hello", 
        ["baz"]: "world"
      };
    
    console.log(myObject["bar"]); // hello
    console.log(myObject["baz"]); // world
    
  • ES6定義了Object.assign(..)方法來實現(xiàn)淺復(fù)制,方法的第一個參數(shù)是目標(biāo)對象惜颇,之后還可以跟一個或多個源對象皆刺。

    var newObj = Object.assign( {}, myObject );
    
    newObj.a; // 2
    newObj.b === anotherObject; // true
    newObj.c === anotherArray; // true
    newObj.d === anotherFunction; // true
    

6、類

二凌摄、Node.js Interview

1羡蛾、內(nèi)存釋放

  • 引用類型是在沒有引用之后, 通過 v8 的 GC 自動回收, 值類型如果是處于閉包的情況下, 要等閉包沒有引用才會被 GC 回收, 非閉包的情況下等待 v8 的新生代 (new space) 切換的時候回收.
  • 內(nèi)存泄漏幾種情況
    • 全局變量

      a = 10;
      //未聲明對象。
      global.b = 11;
      //全局變量引用
      //全局變量直接掛在 root 對象上锨亏,不會被清除掉痴怨。
      
      ////非嚴(yán)格模式下bar會被定義到全局變量,頁面中的全局變量只有在頁面關(guān)閉后才會被銷毀
      function foo(arg) {
          bar = "some text";
      }
      
      ////
      function foo() {
        this.var1 = "potential accidental global";
      }
      // Foo 被調(diào)用時, this 指向全局變量(window)器予,意外的創(chuàng)建了全局變量.
      foo();
      
    • 閉包浪藻,閉包會引用到父級函數(shù)中的變量,如果閉包未釋放乾翔,就會導(dǎo)致內(nèi)存泄漏爱葵。如下代碼是 inner 直接掛在了 root 上,從而導(dǎo)致內(nèi)存泄漏(bigData 不會釋放)末融。

      function out() {
        const bigData = new Buffer(100);
        inner = function () {
          void bigData;
        }
      }
      
    • 未銷毀的定時器和全局函數(shù)钧惧,如下代碼:如果后續(xù) renderer 元素被移除, 整個定時器實際上沒有任何作用. 但如果你沒有回收定時器, 整個定時器依然有效, 不但定時器無法被內(nèi)存回收, 定時器函數(shù)中的依賴也無法回收. 在這個案例中的 serverData 也無法被回收.

      var serverData = loadData();
      setInterval(function() {
          var renderer = document.getElementById('renderer');
          if(renderer) {
              renderer.innerHTML = JSON.stringify(serverData);
          }
      }, 5000); // 每 5 秒調(diào)用一次
      
    • 事件監(jiān)聽

  • Js中的內(nèi)存管理,參考https://zhuanlan.zhihu.com/p/30552148
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勾习,一起剝皮案震驚了整個濱河市浓瞪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巧婶,老刑警劉巖乾颁,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艺栈,居然都是意外死亡英岭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門湿右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诅妹,“玉大人,你說我怎么就攤上這事】越疲” “怎么了尖殃?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長划煮。 經(jīng)常有香客問我送丰,道長,這世上最難降的妖魔是什么弛秋? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任器躏,我火速辦了婚禮,結(jié)果婚禮上蟹略,老公的妹妹穿的比我還像新娘登失。我一直安慰自己,他們只是感情好科乎,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布壁畸。 她就那樣靜靜地躺著,像睡著了一般茅茂。 火紅的嫁衣襯著肌膚如雪捏萍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天空闲,我揣著相機與錄音令杈,去河邊找鬼。 笑死碴倾,一個胖子當(dāng)著我的面吹牛逗噩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跌榔,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼异雁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僧须?” 一聲冷哼從身側(cè)響起纲刀,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担平,沒想到半個月后示绊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡暂论,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年面褐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片取胎。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡展哭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摄杂,我是刑警寧澤坝咐,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站析恢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秧饮。R本人自食惡果不足惜映挂,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盗尸。 院中可真熱鬧柑船,春花似錦、人聲如沸泼各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣蜻。三九已至逆巍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莽使,已是汗流浹背锐极。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芳肌,地道東北人灵再。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像亿笤,于是被迫代替她去往敵國和親翎迁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 第一章 編譯原理 js是一門編譯語言 傳統(tǒng)編譯語言流程: 分詞/詞法分析:把字符串分解成有意義的代碼塊 解析/語法...
    冥冥2017閱讀 593評論 0 0
  • 一、理解js作用域 1罕拂、作用域:作用域是一套規(guī)則揍异,用于確定在何處以及如何查找變量(標(biāo)字符)。2爆班、LHS查詢:查找的...
    懷念不能閱讀 460評論 0 1
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品衷掷,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式柿菩。簡單...
    舟漁行舟閱讀 7,750評論 2 17
  • 深入響應(yīng)式 追蹤變化: 把普通js對象傳給Vue實例的data選項戚嗅,Vue將使用Object.defineProp...
    冥冥2017閱讀 4,868評論 6 16
  • 個人入門學(xué)習(xí)用筆記、不過多作為參考依據(jù)。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點懦胞、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,469評論 1 37