JS高級 05

面向對象實例(圖書管理操作)
  • 報錯異常: throw手動拋出異常信息

    for(){}
    throw ''; 
    
  • return , break 可以終止循環

  • 面向對象的書寫規范

// 1.提供一個構造函數
function Obj(data){
    this.init(data);
}
//2.設置原型書對象
Obj.prototype = {
    // 修正構造器屬性
    constructor : Obj,
  // 初始化的方法(區分不同對象的數據)
    init: function(data){
        // 傳參的兼容性處理
        this.data = data || [];
    },
    fun1 : function (){},
    fun2 : function (){}
}
var obj = new Obj()
obj.init();
嚴格模式
  • 開發中, 有嚴格模式和非嚴格模式,默認是非嚴格模式
  • 嚴格模式: 在嚴格模式下會做更加嚴格的檢查,以前在非嚴格模式下可以使用或者不會報錯的一些代碼,在嚴格模式下會直接報錯
  • 開啟嚴格模式: 'use strict';
    'use strict';
    
    • 這種語法做了向后兼容,如果是支持嚴格模式就會開啟嚴格模式,如果不支持就當做一段字符串處理
  • 建議使用
嚴格模式的注意點(不要求,實際應用查找)
  • 1.必須使用var關鍵字聲明變量
  • 2.使用delete關鍵字刪除全局變量會直接報錯
    'use strict'
    var b = 20;
    console.log(delete b);//報錯
    
  • 3.對象不能存在同名的屬性
  • 4.函數的形參名必須唯一(不能出現同名的形參)
  • 5.禁止使用with語句
  • 6.不能使用eval和arguments作為標識符
  • 7.修正函數內部this的指向
    • this 始終指向你指定的值(非嚴格模式是window)
  • 8.禁止使用八進制
    非嚴格模式前面寫0可能是八進制
    var a = 012;
    
  • 9.在if語句中不能聲明函數
  • 10.不能使用callee和caller,一個指向函數自身,一個指向調用函數的函數
 console.log((function (n) {
            if (n == 1) {
                return 1;
            }
            return arguments.callee(n - 1) + n;
        })(10));

  • 11.在嚴格模式下,arguments的使用有區別
    • 在非嚴格模式下,arguments是存儲的信息是與形參共享的
    • 在嚴格模式下,arguments做了修正,arguments與形參是獨立
    function func(num) {
        console.log(num);
        console.log(arguments[0]);
    // 在非嚴格模式下,arguments是存儲的信息是與形參共享的
        num = 30;
        console.log(num);//30
        console.log(arguments[0]);//30
    //在嚴格模式下,arguments做了修正,arguments與形參是獨立
        num = 30;
        console.log(num);//30
        console.log(arguments[0]);//30
        
    }
    
    fun(12)
    
嚴格模式的書寫格式
  • 1.區分大小寫,必須都是小寫
  • 2.不區分單引號或者雙引號
  • 3.分號可以省略
  • 4.必須是10個字符
嚴格模式的作用域
  • 'use strict'要寫在當前作用域的頂端
    • 1.函數的頂端: 只對當前的函數有作用
    • 2.script的頂端: 只對當前的script標簽有作用
'use strict';
a = 10;
console.log(a);

//'use strict';
b = 20;
console.log(b);

function f1(){
    'use strict';
    b = 30;
    console.log(b);
}
function f2(){
    c = 20;
    console.log(c);
}

f1();

作用域

  • 1.作用域: 一個變量有作用的范圍
  • 2.塊級作用域 : JS中沒有塊級作用域
  • 3.JS中的作用域
    • 1.script標簽組成全局作用域
    • 2.函數是唯一可以創建作用域的對象
  • 4.詞法作用域和動態作用域
    • 詞法作用域: 變量聲明完成后,它的作用域就已經確定好了
      • 詞法作用域的訪問原則: 就近原則,在訪問一個變量的時候,首先在但當前作用域查找,沒有就去上一級作用域查找,知道全局作用域
    • 動態作用域: 變量的作用域由程序執行環境所決定
    • JS屬于詞法作用域

變量和函數的提升

  • JS代碼的執行過程:
    • 1.JS在預解析階段,會對var聲明的變量和function聲明的代碼塊進行聲明提升,提升到當前作用域的頂端
    • 2.解析執行
console.log(a);//undefined
var a = 10;

demo();
function demo() {
    console.log('demo');
}
  • 變量和變量同名: 后面的覆蓋前面的
  • 函數和函數同名: 后面的覆蓋前面的
  • 變量和函數同名: 可以理解為只提升函數的聲明,不提升變量(和函數名同名)的聲明
    console.log(demo);// 函數
    function demo(){
        console.log('函數');
    }
    console.log(demo);// 函數
    var demo = '字符串';
    console.log(demo)// 字符串
    
變量的提升是分作用域點的
  • 變量和函數的聲明提升: 提升到當前作用域的頂端
var a = 10 ;
function f1(){
    console.log(a);// undefined
    var a = 20;
}

function f2(){
    f1();
    var a = 30;
    console.log(a);// 30
}

f2();
函數表達式的提升
  • 函數表達式的提升: 只提升var聲明的變量,并不會把整個函數表達式進行提升
console.log(demo);//undefined
var demo = function (){
    console.log('1');
};
console.log(demo);//函數

面試題 01
// 變量作用域問題
function foo() {
    var num = 123;
    console.log(num);//123
}
foo();
console.log(num);// 報錯
面試題 02
// 變量作用域與變量提升,函數提升
var scope = 'global';

foo();

function foo(){
    console.log(scope);//undefined
    var scope = 'local';
    console.log(scope);//local
}
console.log(scope);//global
面試題 03
// js 沒有塊級作用域
// 全局變量會自動成為window的屬性
if('a' in window){
    var a = 10;
}
console.log(a);//10
面試題 04
// 變量提升
function f1(){
    if('a' in window){
        var a = 10;
    }
    console.log(a); //undefined
}
f1();
面試題 05
if(!'a' in window){
    var a = 10;
}
console.log(a);// undefined

分析:
先!('a'),后判斷 in window
!優先級很高
面試題 06
var foo = 1;
function bar(){
    if(!foo){
        var foo =10;
    }
    console.log(foo); // 10;
}
bar();
面試題 07
function Foo(){
    getName = function(){
        console.log('1');
    }
    return this;
}
Foo.getName = function(){
    console.log('2');
}
Foo.prototype.getName = function(){
    console.log('3');
}
var getName = function(){
    console.log('4');
}
function getName() {
    console.log('5')
}
Foo.getName(); //2
getName()  // 4
Foo().getName(); //1 

getName(); // 1
new Foo.getName(); //2

new Foo().getName();//3
new new Foo().getName();//3

作用域鏈

  • 1.函數可以創建作用域
  • 2.函數中可以聲明一個函數
  • 3.函數的函數中也可以聲明一個函數
  • 以上就形成一個作用域鏈
作用域繪圖
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,199評論 0 13
  • 繼承 一、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關的對象共享這一特性,可以實現繼承,這種實現繼承的...
    magic_pill閱讀 1,080評論 0 3
  • 1. js介紹 js是為了實現網絡交互而是設計的腳本語言,有以下三部分組成 ECMAScript,由ECMA-26...
    Zoemings閱讀 543評論 0 1
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數據類型 5種簡單數據類型:Unde...
    RickCole閱讀 5,162評論 0 21
  • 剛剛讀到這篇文章,很有感觸。我原來也是這樣的人。自己認為是性格的原因,因為我的性格就是比較大大咧咧,差不多就行。還...
    c577eea5ec5b閱讀 552評論 0 3