一、JS一道面試題求y的值是? z 的值是? s的值是?javascript
<script type="text/javascript">
var x = 1;
var y = 0;
var z = 0;
function add(n){n=n+1;}
y = add(x);
function add(n){n=n+3;}
z = add(x);
s=y+z;
</script>html
求:
y的值是?
z 的值是?
s的值是?
我相信,確定有同窗會答錯,固然,不是說他們不會,而是他們可能太大意了!前端
咱們首先看function add,兩個add都沒有返回值,而咱們知道,沒有明確返回值的,所有返回undefined,因此,y和z都會是undefined,那麼s天然也就不會是一個數字了,沒錯,s應該是NaN。
假如咱們將題目改一下呢?以下:
<script type="text/javascript">
var x = 1;
var y = 0;
var z = 0;
function add(n){return n=n+1;}
y = add(x);
function add(n){return n=n+3;}
z = add(x);
s=y+z;
</script>
兩個function add都有返回值了,那麼,y,z,s會是多少呢?
不錯,y和z都是4,s是8,爲何y不是2而是4呢?由於在javascript中,直接經過function申明的函數,後面定義的,會影響到以前的引用,以下:
<script type="text/javascript">
function x(){alert(2)};
x();//output 3
function x(){alert(3)};
x();//output 3
</script>
若是是經過var來申明的函數會是什麼狀況呢?咱們看看:
<script type="text/javascript">
var x = function(){alert(0)};
x();//output 0
var x=function(){alert(1)};
x();//output 1
x();//output 1
</script>
經過var申明的函數,後面定義的並不會影響前面的引用。
若是兩種模式混合,又會是什麼狀況呢?
<script type="text/javascript">
function x(){alert(2)};
x();//output 3
var x = function(){alert(0)};
x();//output 0
var x=function(){alert(1)};
x();//output 1
function x(){alert(3)};
x();//output 1
</script>
結果是這樣的,你猜到了嗎?
經過function定義的函數,後面定義的,照舊影響了前面的引用,可是不能改變經過var申明函數後的引用,反而,經過var申明的函數,改變了後來經過function申明函數以後的引用。
因此,若是:
<script type="text/javascript">
var x=function(){alert(1)};
x();
function x(){alert(3)};
x();
</script>
後面的x()出來的也會是1。java
二、前端面試題整理:實現一個對頁面某個節點的拖拽jquery
三、如何經過 JS 識別怪異模式和標準模式?兩種模式有什麼區別?面試
要想寫出跨瀏覽器的CSS,必須知道瀏覽器解析CSS的兩種模式:標準模式(strict mode)和怪異模式(quirks mode)。瀏覽器
所謂的標準模式是指,瀏覽器按W3C標準解析執行代碼;怪異模式則是使用瀏覽器本身的方式解析執行代碼,由於不一樣瀏覽器解析執行的方式不同,因此咱們稱之爲怪異模式。瀏覽器解析時到底使用標準模式仍是怪異模式,與你網頁中的DTD聲明直接相關,DTD聲明定義了標準文檔的類型(標準模式解析)文檔類型,會使瀏覽器使用相應的方式加載網頁並顯示,忽略DTD聲明,將使網頁進入怪異模式(quirks mode)。函數
<html>ui
<head>spa
<title>重慶PHP</title>
</head>
<body>
<h3>重慶PHP,最專業的PHP社區</h3>
</body>
</html>
若是你的網頁代碼不含有任何聲明,那麼瀏覽器就會採用怪異模式解析,即是若是你的網頁代碼含有DTD聲明,瀏覽器就會按你所聲明的標準解析。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>重慶PHP</title>
</head>
<body>
<h3>重慶PHP,最專業的PHP社區</h3>
</body>
</html>
上面的代碼,瀏覽器會按HTML 4.01的標準進行解析。
標準模式中IE6不認識!important聲明,IE七、IE八、Firefox、Chrome等瀏覽器認識;而在怪異模式中,IE6/7/8都不認識!important聲明,這只是區別的一種,還有不少其它區別。因此,要想寫出跨瀏覽器的CSS,你必須採用標準模式。好像太絕對了,呵呵。好吧,要想寫出跨瀏覽器CSS,你最好採用標準模式。
到底都有哪些聲明呢?哪一種聲明更好呢?咱們建議你使用XHTML 1.0最嚴格模式,從一開始咱們就應該嚴格的要求本身,具體聲明以下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
若是你接手的是一個遺留網頁,最初並無DTD聲明,而且使用了不少在XHTML中已經廢除的標籤,那麼,咱們建議你使用XHTML兼容模式,聲明以下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
那麼如何的識別呢?舉一個簡單的例子
方法一:執行如下代碼
alert(window.top.document.compatMode) ;
//BackCompat 表示怪異模式
//CSS1Compat 表示標準模式
方法二:jquery爲咱們提供的方法,以下:
alert($.boxModel)
alert($.support.boxModel)
var compat=window.top.document.compatMode;
var cw=compat=="BackCompat"?
window.top.document.body.clientWidth:
window.top.document.documentElement.clientWidth;