導航:首頁 > 源碼編譯 > js預編譯的表達式

js預編譯的表達式

發布時間:2022-05-27 13:10:58

『壹』 【JS】為什麼我定義的函數不能執行IF語句裡面的

1、函數定義的方式方式分為兩種,一種是函數聲明,一種是函數表達式。

//函數聲明的方式
functionmyfunc1(){
//todo
}

//函數表達式的方式
varmyfunc2=function(){
//todo
}

函數聲明的方式會在js解析預編譯階段得到提升,不管是寫在調用之前還是調用之後,使用的時候都可以找到函數;函數表達式,和普通的定義變數一樣,js自上而下執行,當執行到這條語句時,函數才有定義。

2、數組里的大寫字母去掉。遇到這種情況,就要考慮使用倒序的方式去遍歷刪除,因為每刪除一項,數組長度就會變化,正序遍歷就會導致錯誤。

varx2=["a","b","C","d","E","f"];
for(varl=x2.length,i=l-1;i>=0;i--){
if(x2[i]>="A"&&x2[i]<="Z"){
x2.splice(i,1);
}
}

//輸出a,b,d,f
console.log(x2.join());

『貳』 js函數定義方式的區別

在JS中函數的定義可以分為兩種:
1. 函數聲明
2. 函數表達式

根據你的代碼,下面的代碼就是函數的聲明(當然另外一段代碼是函數表達式):
function a (){
alert(123);
}

根據JS中的語法特性(注意哦,是js的語法特點,要記住):
javascript函數體內(執行作用域)聲明的變數,無論在函數體何處聲明,它將都會被提升到函數的頂部,我們稱這種現象為變數提升。 函數呢,它也有這種特性,即無論在函數體何處聲明另一個函數,它將都會被提升到函數的頂部。只是採用函數表達式和函數聲明所體現的函數提升的內容是有差別的:函數表達式和變數提升類似,只會提升函數的變數,不提升函數的定義;而函數聲明提升時,不僅僅會提升函數的聲明,函數的定義也會被提升

根據以上特性,你的代碼在執行時,
function a (){
alert(123);
}
這段代碼被提升到執行作用域的頂端,最開始被執行;

然後,在執行
var a =function(){

alert('234');
}
這段代碼,導致該代碼覆蓋了前面的函數聲明代碼;

不信你可以做個測試:
將a()放到js代碼的最頂端,可以看看會列印什麼結果,此時你就明白了!

『叄』 JavaScript正則表達式cookie.replace(/^\s+|\s+$/g, '');什麼意思

整體為如果cookie以一個或多個空格開始,替換全部空格為空,或者,如果cookie以一個或多個空格結束,替換全部空格為空。

符號含義:

s: space, 空格

+: 一個或多個

^: 開始,^s,以空格開始

$: 結束,s$,以空格結束

|:或者

/g:global, 全局

replace() 替換

(3)js預編譯的表達式擴展閱讀:

基本特點

JavaScript是一種屬於網路的腳本語言,已經被廣泛用於Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

是一種解釋性腳本語言(代碼不進行預編譯)。

主要用來向HTML(標准通用標記語言下的一個應用)頁面添加交互行為。、

可以直接嵌入HTML頁面,但寫成單獨的js文件有利於結構和行為的分離。

跨平台特性,在絕大多數瀏覽器的支持下,可以在多種平台下運行(如Windows、Linux、Mac、Android、iOS等)。

Javascript腳本語言同其他語言一樣,有它自身的基本數據類型,表達式和算術運算符及程序的基本程序框架。Javascript提供了四種基本的數據類型和兩種特殊數據類型用來處理數據和文字。而變數提供存放信息的地方,表達式則可以完成較復雜的信息處理。

JavaScript腳本語言具有以下特點:

(1)腳本語言。JavaScript是一種解釋型的腳本語言,C、C++等語言先編譯後執行,而JavaScript是在程序的運行過程中逐行進行解釋。

(2)基於對象。JavaScript是一種基於對象的腳本語言,它不僅可以創建對象,也能使用現有的對象。

(3)簡單。JavaScript語言中採用的是弱類型的變數類型,對使用的數據類型未做出嚴格的要求,是基於Java基本語句和控制的腳本語言,其設計簡單緊湊。

(4)動態性。JavaScript是一種採用事件驅動的腳本語言,它不需要經過Web伺服器就可以對用戶的輸入做出響應。在訪問一個網頁時,滑鼠在網頁中進行滑鼠點擊或上下移、窗口移動等操作JavaScript都可直接對這些事件給出相應的響應。

(5)跨平台性。JavaScript腳本語言不依賴於操作系統,僅需要瀏覽器的支持。因此一個JavaScript腳本在編寫後可以帶到任意機器上使用。

『肆』 JS表達式和語句的區別

JS表達式和語句的區別總結如下:
1.表達式(expressions)
表達式是由運算符構成,並運算產生結果的語法結構。每個表達式都會產生一個值,它可以放在任何需要一個值的地方,比如,作為一個函數調用的參數.下面的每行代碼都是一個表達式:
var a = (5 + 6) / 2; //表達式:(5 + 6) / 2
var b = (function(){ return 25;})(); //表達式: (function(){ return 25;})()
foo(a*b); //表達式:a*b

2.語句(statements)
語句則是由「;(分號)」分隔的句子或命令。如果在表達式後面加上一個「;」分隔符,這就被稱為「表達式語句」。它表明「只有表達式,而沒有其他語法元素的語句」。
var a = (5 + 6) / 2; //整行,賦值語句
if(a>12) { statements} //條件語句
var o = {}; //賦值語句
(function(obj){ obj.b = 23;})(o||{}); //表達式語句

一般的javascript中的語句分為下面幾種:
(1)聲明語句:變數聲明和函數聲明
(2)賦值語句
(3)控制語句:能夠對語句執行順序產生改變,包括條件語句和循環語句,當然還有比較特殊的標簽語句。
(4)表達式語句:這些語句去掉最後分號,都也可當表達式用的。常見的有:對象操作(new、delete)、函數調用(函數執行,必有返回值)等。
var num = 9; //聲明、賦值語句
vloop: //標簽語句
{ //其實這里大括弧可以不需要的,在這里我只想向大家展示一下這種代碼塊結構而已
for(var i=1; i<10; i++) { //循環語句
if(i==num){ //條件語句
break vloop;
}else{
num = num - 1;
}
}
}
console.log(num); //表達式語句,輸出:5

由上面可以看出,表達式和語句還是存在很大區別的,可也說表達式是語句的構成部分,而語句則又可以組成可執行代碼塊。一般而已,我們都可以很直觀的看出兩者的區別,但是,一些特殊情況就不太好區別。

『伍』 Js編程語言中,什麼叫匿名自我調用函數

匿名函數:就是沒有函數名的函數。
函數的定義,大致可分為三種方式:

第一種:這也是最常規的一種

function double(x){
return 2 * x;
}

第二種:這種方法使用了Function構造函數,把參數列表和函數體都作為字元串,很不方便,不建議使用。

var double = new Function('x', 'return 2 * x;');

第三種:

var double = function(x) { return 2* x; }

注意「=」右邊的函數就是一個匿名函數,創造完畢函數後,又將該函數賦給了變數square。

匿名函數的創建

第一種方式:就是上面所講的定義square函數,這也是最常用的方式之一。

第二種方式:

(function(x, y){
alert(x + y);
})(2, 3);

這里創建了一個匿名函數(在第一個括弧內),第二個括弧用於調用該匿名函數,並傳入參數。括弧是表達式,是表達式就有返回值,所以可以在後面加一對括弧讓它們執行.

自執行的匿名函數

1. 什麼是自執行的匿名函數?

它是指形如這樣的函數: (function {// code})();

2. 疑問

為什麼(function {// code})();可以被執行, 而function {// code}();卻會報錯?

3. 分析

(1). 首先, 要清楚兩者的區別:
(function {// code})是表達式, function {// code}是函數聲明.
(2). 其次, js"預編譯"的特點:
js在"預編譯"階段, 會解釋函數聲明, 但卻會忽略表式.
(3). 當js執行到function() {//code}();時, 由於function() {//code}在"預編譯"階段已經被解釋過, js會跳過function(){//code}, 試圖去執行();, 故會報錯;
當js執行到(function {// code})();時, 由於(function {// code})是表達式, js會去對它求解得到返回值, 由於返回值是一 個函數, 故而遇到();時, 便會被執行.

另外, 函數轉換為表達式的方法並不一定要靠分組操作符(),我們還可以用void操作符,~操作符,!操作符……

如:

!function(){
alert("另類的匿名函數自執行");
}();

匿名函數與閉包

閉包的英文單詞是closure,這是JavaScript中非常重要的一部分知識,因為使用閉包可以大大減少我們的代碼量,使我們的代碼看上去更加清晰等等,總之功能十分強大。

閉包的含義:閉包說白了就是函數的嵌套,內層的函數可以使用外層函數的所有變數,即使外層函數已經執行完畢(這點涉及JavaScript作用域鏈)。

function checkClosure(){
var str = 'rain-man';
setTimeout(
function(){ alert(str); } //這是一個匿名函數
, 2000);
}
checkClosure();

這個例子看上去十分的簡單,仔細分析下它的執行過程還是有許多知識點的:checkClosure函數的執行是瞬間的(也許用時只是0.00001毫秒),在checkClosure的函數體內創建了一個變數str,在checkClosure執行完畢之後str並沒有被釋放,這是因為setTimeout內的匿名函數存在這對str的引用。待到2秒後函數體內的匿名函數被執行完畢,str才被釋放。

用閉包來優化代碼:

function forTimeout(x, y){
alert(x + y);
}
function delay(x , y , time){
setTimeout('forTimeout(' + x + ',' + y + ')' , time);
}
/**
* 上面的delay函數十分難以閱讀,也不容易編寫,但如果使用閉包就可以讓代碼更加清晰
* function delay(x , y , time){
* setTimeout(
* function(){
* forTimeout(x , y)
* }
* , time);
* }
*/

匿名函數最大的用途是創建閉包(這是JavaScript語言的特性之一),並且還可以構建命名空間,以減少全局變數的使用。

var oEvent = {};
(function(){
var addEvent = function(){ /*代碼的實現省略了*/ };
function removeEvent(){}

oEvent.addEvent = addEvent;
oEvent.removeEvent = removeEvent;
})();

在這段代碼中函數addEvent和removeEvent都是局部變數,但我們可以通過全局變數oEvent使用它,這就大大減少了全局變數的使用,增強了網頁的安全性。

我們要想使用此段代碼:

oEvent.addEvent(document.getElementById('box') , 'click' , function(){});
var rainman = (function(x , y){
return x + y;
})(2 , 3);
/**
* 也可以寫成下面的形式,因為第一個括弧只是幫助我們閱讀,但是不推薦使用下面這種書寫格式。
* var rainman = function(x , y){
* return x + y;
* }(2 , 3);

在這里我們創建了一個變數rainman,並通過直接調用匿名函數初始化為5,這種小技巧有時十分實用。

var outer = null;
(function(){
var one = 1;
function inner (){
one += 1;
alert(one);
}
outer = inner;
})();
outer(); //2
outer(); //3
outer(); //4

這段代碼中的變數one是一個局部變數(因為它被定義在一個函數之內),因此外部是不可以訪問的。但是這里我們創建了inner函數,inner函數是可以訪問變數one的;又將全局變數outer引用了inner,所以三次調用outer會彈出遞增的結果。

『陸』 javascript函數表達式的問題怎麼解決

javascript雖然是解釋執行的語言,但也會進行預編譯。

if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}


這種形式,JS引擎在預編譯的過程中會注冊方法到window對象下,就是window.sayHi。
而不會顧及if else條件,導致重復的sayHi方法被注冊,在這種情況下是無效語法。


var sayHi;
if(condition){
sayHi=function sayHi(){
alert("Hi!");
};
}else{
sayHi=function sayHi(){
alert("Yo!");
};
}

而下面這種是作為一個 變數(而非函數function),變數是可以被重復賦值的,所以語法不會有問題。

『柒』 如何用js實現中綴表達式轉後綴表達式然後求值

逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做後綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表達式 逆波蘭表達式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)d ---> a,d,b,c,-,,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 寫成什麼呢?
http=smtp,http,telnet,+,+,1024,/
逆波蘭表達式是一種十分有用的表達式,它將復雜表達式轉換為可以依靠簡單的操作得到計算結果的表達式。例如(a+b)(c+d)轉換為ab+cd+
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表達式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算符,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表達式掃描完後,棧里的就是結果。
將一個普通的中序表達式轉換為逆波蘭表達式的一般演算法是:
(1)首先構造一個運算符棧,此運算符在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入一個用中綴表示的簡單算術表達式,為方便起見,設該簡單算術表達式的右端多加上了優先順序最低的特殊符號「#」。
(3)從左至右掃描該算術表達式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算符,此時需比較優先關系。
做法如下:將該字元與運算符棧頂的運算符的優先關系相比較。如果,該字元優先關系高於此運算符棧頂的運算符,則將該運算符入棧。倘若不是的話,則將棧頂的運算符從棧中彈出,直到棧頂運算符的優先順序低於當前運算符,將該字元入棧。
(5)重復上述操作(3)-(4)直至掃描完整個簡單算術表達式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表達式轉化為逆波蘭表示的簡單算術表達式。
下面是程序化演算法流程:
1、建立運算符棧stackOperator用於運算符的存儲,壓入'\0'。
2、預處理表達式,正、負號前加0(如果一個加號(減號)出現在最前面或左括弧後面,則該加號(減號)為正負號) 。
3、順序掃描表達式,如果當前字元是數字(優先順序為0的符號),則直接輸出該數字;如果當前字元為運算符或括弧(優先順序不為0的符號),則判斷第4點 。
4、若當前運算符為'(',直接入棧;
若為')',出棧並順序輸出運算符直到遇到第一個'(',遇到的第一個'('出棧但不輸出;
若為其它,比較stackOperator棧頂元素與當前元素的優先順序:
如果 棧頂元素 >= 當前元素,出棧並順序輸出運算符直到 棧頂元素 < 當前元素,然後當前元素入棧;
如果 棧頂元素 < 當前元素,直接入棧。
5、重復第3點直到表達式掃描完畢。
6、順序出棧並輸出運算符直到棧頂元素為'\0'。
各運算符及符號優先順序:
'\0': -1
')': 1
'(': 2
'+'、'-': 3
'*'、'/'、'%': 4
'^': 5
其它: 0

/**
* 計算逆波蘭表達式的值
*/
function calculate(RPolishArray){
var result = 0;
var tempArray = new Array(100);
var tempNum = -1;
for(i = 0;i < RPolishArray.length;i++){
if(RPolishArray[i].match(/\d/)){
tempNum++;
tempArray[tempNum] = RPolishArray[i];
}else{
switch(RPolishArray[i]){
case '+':
result = (tempArray[tempNum-1] *1) + (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '-':
result = (tempArray[tempNum-1] *1) - (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '*':
result = (tempArray[tempNum-1] *1) * (tempArray[tempNum] * 1);
tempNum--;

『捌』 javascript函數定義表達式和函數聲明的區別

什麼是 Function Declaration(函數聲明)?
Function Declaration 可以定義命名的函數變數,而無需給變數賦值。Function Declaration 是一種獨立的結構,不能嵌套在非功能模塊中。可以將它類比為 Variable Declaration(變數聲明)。就像 Variable Declaration 必須以「var」開頭一樣,Function Declaration 必須以「function」開頭。
什麼是 Function Expression(函數表達式)?
Function Expression 將函數定義為表達式語句(通常是變數賦值)的一部分。通過 Function Expression 定義的函數可以是命名的,也可以是匿名的。Function Expression 不能以「function」開頭。

『玖』 JavaScript:函數聲明與函數表達式

javascript雖然是解釋執行的語言,但也會進行預編譯。

if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}


這種形式,JS引擎在預編譯的過程中會注冊方法到window對象下,就是window.sayHi。

而不會顧及ifelse條件,導致重復的sayHi方法被注冊,在這種情況下是無效語法。

var sayHi;
if(condition){
sayHi=function sayHi(){
alert("Hi!");
};
}else{
sayHi=function sayHi(){
alert("Yo!");
};
}


而下面這種是作為一個變數(而非函數function),變數是可以被重復賦值的,所以語法不會有問題。


不知道有沒有說清楚。

『拾』 js中表達式和語句的區別

一、兩者的定義區別:一個表達式會產生一個值,它可以放在任何需要一個值的地方,如語句則是由分號分隔的句子或命令。如果在表達式後面加上一個「;」分隔符,這就被稱為「表達式語句」。它表明「只有表達式,而沒有其他語法元素的語句」。

二、兩者的功能區別:表達式經常用作作為一個函數調用的參數,它可以放在任何需要一個值的地方。而語句則是一個行為,循環語句和if語句就是典型的語句,一個程序是由一系列語句組成的。

三、是否支持嵌套方式的區別:在javascript中所有表達式都有返回值,表達式均可以嵌套在別的表達式中,但語句不行,語句只能獨立出現。

(10)js預編譯的表達式擴展閱讀

表達式和語句之間,存在一種叫做表達式語句的。序基本上是一系列語句的結合(基礎聲明除外)。無論何時,當JavaScript需要編寫一條語句時,均可以寫入一個表達式。這樣的語句稱為表達式語句(expression statement)。但是反之並不成立,不能編寫一條語句來代替表達式。

例如:if語句var x;if (y >= 0) {x = y;} else {x = -y;}。與表達式類似的是條件運算符。上述語句可用以下語句代替var x = (y >= 0 ? y : -y);兩種表達均可實現一樣的作用效果。

閱讀全文

與js預編譯的表達式相關的資料

熱點內容
java解析網頁 瀏覽:836
2020廣西藝術分演算法 瀏覽:101
手機解壓文件大不能解壓 瀏覽:99
android獲取當前系統時間 瀏覽:324
蘋果電腦安卓版怎麼還原 瀏覽:612
javaftpjar 瀏覽:324
phpmysql自增id 瀏覽:920
仿抖音系統源碼建站 瀏覽:746
雲伺服器搭建sqlserver2008 瀏覽:950
如何查看伺服器安全組 瀏覽:429
雲伺服器會保存app記錄嗎 瀏覽:716
程序員身份證年齡 瀏覽:943
appstore如何注冊一個美國帳號 瀏覽:321
春筍公式源碼 瀏覽:497
蔚來app如何反饋 瀏覽:51
基礎生態學pdf 瀏覽:957
cp2012單片機 瀏覽:990
張曉謙程序員 瀏覽:115
取消應用加密忘記密碼 瀏覽:998
心熵pdf 瀏覽:809