以Python角度学习Javascript(一)

记忆如沙指尖过,叹如果,何为如,何为果? 花季,风碾过,零落一地寂寞,谁明身该如何,土也湮没,雨坐,重刷遗地的香一抹。

认识javascript

JavaScript 是属于网络的脚本语言!

JavaScript 是因特网上最流行的脚本语言。

JavaScript 是一种轻量级的编程语言。

JavaScript 被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。

JavaScript 是可插入 HTML 页面的编程代码。

JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行。

JavaScript 很容易学习。

JavaScript 很容易使用!你一定会喜欢它的

一、如何编写

1、JavaScript代码存在形式

<!-- 方式一 -->
<script type"text/javascript" src="JS文件"></script>
  
<!-- 方式二 -->
<script type"text/javascript">
    Js代码内容
</script>
形式

2、JavaScript代码存放位置

  • HTML的head中
  • HTML的body代码块底部(推荐)

由于Html代码是从上到下执行,如果Head中的js代码耗时严重,就会导致用户长时间无法看到页面,如果放置在body代码块底部,那么即使js代码耗时严重,也不会影响用户看到页面效果,只是js实现特效慢而已。

二、变量

JavaScript中变量的声明是一个非常容易出错的点,局部变量必须一个 var 开头,如果未使用var,则默认表示声明的是全局变量。

<script type="text/javascript">
 
    // 全局变量
    name = 'seven';
 
    function func(){
        // 局部变量
        var age = 18;
 
        // 全局变量
        gender = ""
    }
</script>

JavaScript中代码注释:

  • 单行 //
  • 多行 /*  */

注意:此注释仅在Script块中生效。

三、数据类型

JavaScript 中的数据类型分为原始类型和对象类型:

  • 原始类型
    • 数字
    • 字符串
    • 布尔值
  • 对象类型
    • 数组
    • “字典”
    • ...

特别的,数字、布尔值、null、undefined、字符串是不可变。

// null、undefined
null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。
undefined是一个特殊值,表示变量未定义。

1、数字(Number)

JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示。

转换:

  • parseInt(..)    将某值转换成数字,不成功则NaN
  • parseFloat(..) 将某值转换成浮点数,不成功则NaN

特殊值:

  •  NaN,非数字。可使用 isNaN(num) 来判断。
  • Infinity,无穷大。可使用 isFinite(num) 来判断。

判断类型:

  typeof

更多数值计算:

常量

Math.E
常量e,自然对数的底数。

Math.LN10
10的自然对数。

Math.LN2
2的自然对数。

Math.LOG10E
以10为底的e的对数。

Math.LOG2E
以2为底的e的对数。

Math.PI
常量figs/U03C0.gif。

Math.SQRT1_2
2的平方根除以1。

Math.SQRT2
2的平方根。

静态函数

Math.abs( )
计算绝对值。

Math.acos( )
计算反余弦值。

Math.asin( )
计算反正弦值。

Math.atan( )
计算反正切值。

Math.atan2( )
计算从X轴到一个点的角度。

Math.ceil( )
对一个数上舍入。

Math.cos( )
计算余弦值。

Math.exp( )
计算e的指数。

Math.floor( )
对一个数下舍人。

Math.log( )
计算自然对数。

Math.max( )
返回两个数中较大的一个。

Math.min( )
返回两个数中较小的一个。

Math.pow( )
计算xy。

Math.random( )
计算一个随机数。

Math.round( )
舍入为最接近的整数。

Math.sin( )
计算正弦值。

Math.sqrt( )
计算平方根。

Math.tan( )
计算正切值。

Math
更多数值

2、字符串(String)

字符串是由字符组成的数组,但在JavaScript中字符串是不可变的:可以访问字符串任意位置的文本,但是JavaScript并未提供修改已知字符串内容的方法。

常见功能:

obj.length                           长度

定义和用法
length 属性可设置或返回数组中元素的数目。
语法
arrayObject.length
实例
<script type="text/javascript">

var arr = new Array(3)
arr[0] = "John"
arr[1] = "Andy"
arr[2] = "Wendy"

document.write("Original length: " + arr.length)
document.write("<br />")

arr.length=5
document.write("New length: " + arr.length)

</script>
输出:
Original length: 3
New length: 5
讲解

obj.trim()                           移除空白
obj.trimLeft()
obj.trimRight()

obj.charAt(n)                        返回字符串中的第n个字符

//字符中的字符从左向右进行索引,由0开始,字符串中的空格也算在内
案例:
var string = "charAt find word position";
document.write("charAt find word position"+ "<br/>")
document.write("string.charAt(0) is:" + string.charAt(0) + "<br/>");
document.write("string.charAt(1) is:" + string.charAt(1) + "<br/>");
document.write("string.charAt(2) is:" + string.charAt(2) + "<br/>");
document.write("string.charAt(3) is: " + string.charAt(3) + "<br/>");
document.write("string.charAt(4) is: " + string.charAt(4) + "<br/>");
document.write("string.charAt(5) is: " + string.charAt(5) + "<br/>");
document.write("string.charAt(6) is: " + string.charAt(6) + "<br/>");
document.write("string.charAt(7) is: " + string.charAt(7) + "<br/>"); 
document.write("string.charAt(string.length-2) is: " + string.charAt(string.length-2) + "<br/>")
document.write("string.charAt(string.length-1) is: " + string.charAt(string.length-1) + "<br/>")

//输出结果
string.charAt(0) is:c
string.charAt(1) is:h
string.charAt(2) is:a
string.charAt(3) is: r
string.charAt(4) is: A
string.charAt(5) is: t
string.charAt(6) is: 
string.charAt(7) is: f
string.charAt(string.length-2) is: o
string.charAt(string.length-1) is: n
详解

obj.concat(value, ...)               拼接

定义和用法

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)

实例
例子 1

在本例中,我们将把 concat() 中的参数连接到数组 a 中:

<script type="text/javascript">

var a = [1,2,3];
document.write(a.concat(4,5));

</script>

输出:

1,2,3,4,5

例子 2

在本例中,我们创建了两个数组,然后使用 concat() 把它们连接起来:

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

var arr2 = new Array(3)
arr2[0] = "James"
arr2[1] = "Adrew"
arr2[2] = "Martin"

document.write(arr.concat(arr2))

</script>

输出:

George,John,Thomas,James,Adrew,Martin

例子 3

在本例中,我们创建了三个数组,然后使用 concat() 把它们连接起来:

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

var arr2 = new Array(3)
arr2[0] = "James"
arr2[1] = "Adrew"
arr2[2] = "Martin"

var arr3 = new Array(2)
arr3[0] = "William"
arr3[1] = "Franklin"

document.write(arr.concat(arr2,arr3))

</script>

输出:

George,John,Thomas,James,Adrew,Martin,William,Franklin
详解和案例

obj.indexOf(substring,start)         子序列位置

定义和用法

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
语法

stringObject.indexOf(searchvalue,fromindex)
参数     描述
searchvalue     必需。规定需检索的字符串值。
fromindex     可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。

提示和注释

注释:indexOf() 方法对大小写敏感!

注释:如果要检索的字符串值没有出现,则该方法返回 -1。

实例

在本例中,我们将在 "Hello world!" 字符串内进行不同的检索:

<script type="text/javascript">

var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")
document.write(str.indexOf("World") + "<br />")
document.write(str.indexOf("world"))

</script>

以上代码的输出:

0
-1
6
案例详解

obj.lastIndexOf(substring,start)     子序列位置

定义和用法

lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
语法

stringObject.lastIndexOf(searchvalue,fromindex)

案例:
        <script type="text/javascript">

        var str="Hello world world!"
        document.write(str.lastIndexOf("Hello") + "<br />")
        document.write(str.lastIndexOf("World") + "<br />")
        document.write(str.lastIndexOf("world"))
        
        </script>
以上代码的输出:
0
-1
12
View Code

obj.substring(from, to)              根据索引获取子序列

定义和用法

substring() 方法用于提取字符串中介于两个指定下标之间的字符。
语法

stringObject.substring(start,stop)

参数     描述
start     必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
stop     

可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。

如果省略该参数,那么返回的子串会一直到字符串的结尾。
实例
例子 1

在本例中,我们将使用 substring() 从字符串中提取一些字符:

<script type="text/javascript">

var str="Hello world!"
document.write(str.substring(3))

</script>

输出:

lo world!
例子 2

在本例中,我们将使用 substring() 从字符串中提取一些字符:

<script type="text/javascript">

var str="Hello world!"
document.write(str.substring(3,7))

document.write(str.substring(3,str.length))//都行
</script>

输出:

lo w
案例讲解

obj.slice(start, end)                切片

定义和用法

slice() 方法可从已有的数组中返回选定的元素。
语法

arrayObject.slice(start,end)

参数     描述
start     必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end     可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回值

返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
说明

请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。
提示和注释

注释:您可使用负值从数组的尾部选取元素。

注释:如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。
实例
例子 1

在本例中,我们将创建一个新数组,然后显示从其中选取的元素:

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

document.write(arr + "<br />")
document.write(arr.slice(1) + "<br />")
document.write(arr)

</script>

输出:

George,John,Thomas
John,Thomas
George,John,Thomas

例子 2

在本例中,我们将创建一个新数组,然后显示从其中选取的元素:

<script type="text/javascript">

var arr = new Array(6)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
arr[3] = "James"
arr[4] = "Adrew"
arr[5] = "Martin"

document.write(arr + "<br />")
document.write(arr.slice(2,4) + "<br />")
document.write(arr)

</script>

输出:

George,John,Thomas,James,Adrew,Martin
Thomas,James
George,John,Thomas,James,Adrew,Martin
案例讲解

obj.toLowerCase()                    小写

定义和用法

toLowerCase() 方法用于把字符串转换为小写。
语法

stringObject.toLowerCase()

返回值

一个新的字符串,在其中 stringObject 的所有大写字符全部被转换为了小写字符。
实例

在本例中,"Hello world!" 将以小写字母来显示:

<script type="text/javascript">

var str="Hello World!"
document.write(str.toLowerCase())

</script>
案例讲解

obj.toUpperCase()                    大写

obj.split(delimiter, limit)          分割

定义和用法

split() 方法用于把一个字符串分割成字符串数组。
语法

stringObject.split(separator,howmany)

参数     描述
separator     必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany     可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
返回值

一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。

但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。
提示和注释

注释:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

注释:String.split() 执行的操作与 Array.join 执行的操作是相反的。
详解
实例
例子 1

在本例中,我们将按照不同的方式来分割字符串:

<script type="text/javascript">

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

</script>

输出:

How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

案例二:
a = "alex7eric9uuuy";
a.split(/\d+/)    答案:["alex", "eric", "uuuy"]
a.split(/(\d+)/)   答案:["alex", "7", "eric", "9", "uuuy" ]
a.split(/(\d+)e/) 答案:["alex", "7", "ric", "9", "uuuy"]
案例

obj.search(regexp)                   方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

定义和用法

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
语法

stringObject.search(regexp)

参数     描述
regexp     

该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。

注释:要执行忽略大小写的检索,请追加标志 i。
返回值

stringObject 中第一个与 regexp 相匹配的子串的起始位置。

注释:如果没有找到任何匹配的子串,则返回 -1。
说明

search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。
实例
例子 1

在本例中,我们将检索 "W3School"<script type="text/javascript">

var str="Visit W3School!"
document.write(str.search(/W3School/))

</script>

输出:

6

在下面的例子中,无法检索到 w3school(因为 search() 对大小写敏感)。

<script type="text/javascript">

var str="Visit W3School!"
document.write(str.search(/w3school/))

</script>

输出:

-1

例子 2

在本例中,我们将执行一次忽略大小写的检索:

<script type="text/javascript">

var str="Visit W3School!"
document.write(str.search(/w3school/i))

</script>

输出:

6
讲解及案例

obj.match(regexp)                    全局搜索,如果正则中有g表示找到全部,否则只找到第一个。

定义和用法

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
语法

stringObject.match(searchvalue)
stringObject.match(regexp)

参数     描述
searchvalue     必需。规定要检索的字符串值。
regexp     必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。
返回值

存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。
讲解
实例
例子 1

在本例中,我们将在 "Hello world!" 中进行不同的检索:

<script type="text/javascript">

var str="Hello world!"
document.write(str.match("world") + "<br />")
document.write(str.match("World") + "<br />")
document.write(str.match("worlld") + "<br />")
document.write(str.match("world!"))

</script>

输出:

world
null
null
world!

例子 2

在本例中,我们将使用全局匹配的正则表达式来检索字符串中的所有数字:

<script type="text/javascript">

var str="1 plus 2 equal 3"
document.write(str.match(/\d+/g))

</script>

输出:

1,2,3
案例

obj.replace(regexp, replacement)     替换,正则中有g则替换所有,否则只替换第一个匹配项,
                                     $数字:匹配的第n个组内容;
                                     $&:当前匹配的内容;
                                     $`:位于匹配子串左侧的文本;
                                     $':位于匹配子串右侧的文本
                                     $$:直接量$符号

 

 1 a
 2 "alex7eric9Euuy"
 3 a.replace(/\d+/,"&")
 4 "alex&eric9Euuy"
 5 a.replace(/\d+/g,"&")
 6 "alex&eric&Euuy"
 7 a.replace(/\d+/g,"$")
 8 "alex$eric$Euuy"
 9 a.replace(/\d+/,"$")
10 "alex$eric9Euuy"
11 a.replace(/(\d+)/,"x")
12 "alexxeric9Euuy"
13 a.replace(/(\d+)/g,"x")
14 "alexxericxEuuy"
15 a.replace(/(\d+)/g,"$&"+"x")
16 "alex7xeric9xEuuy"
17 a.replace(/(\d+)\w+(\d+)/g, "$1$2")
18 "alex79Euuy"
19 a.replace(/(\d+)\w+(\d+)/g,"$2$1")
20 "alex97Euuy"
21 a.replace(/(\d+)(\w+)(\d+)/g,"$3$1$2")
22 "alex97ericEuuy"
案例
1 a.replace(/\d+/g, "$`")
2 "alexalexericalex7ericEuuy"
3 a
4 "alex7eric9Euuy"
5 a.replace(/\d+/g, "$`")
6 "alexalexericalex7ericEuuy"
7 a.replace(/\d+/g, "$$")
8 "alex$eric$Euuy"
案例

3、布尔类型(Boolean)

布尔类型仅包含真假,与Python不同的是其首字母小写。

  • ==      比较值相等
  • !=       不等于
  • ===   比较值和类型相等
  • !===  不等于
  • ||        或
  • &&      且

4、数组

JavaScript中的数组类似于Python中的列表

常见功能:

obj.length          数组的大小
obj.push(ele)       尾部追加元素
obj.pop()           尾部获取一个元素
obj.unshift(ele)    头部插入元素
obj.shift()         头部移除元素
obj.splice(start, deleteCount, value, ...)  插入、删除或替换数组的元素
                    obj.splice(n,0,val) 指定位置插入元素
                    obj.splice(n,1,val) 指定位置替换元素
                    obj.splice(n,1)     指定位置删除元素
obj.slice( )        切片
obj.reverse( )      反转
obj.join(sep)       将数组元素连接起来以构建一个字符串
obj.concat(val,..)  连接数组
obj.sort( )         对数组元素进行排序
实例
例子 1

在本例中,我们将创建一个数组,并按字母顺序进行排序:

<script type="text/javascript">

var arr = new Array(6)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
arr[3] = "James"
arr[4] = "Adrew"
arr[5] = "Martin"

document.write(arr + "<br />")
document.write(arr.sort())

</script>

输出:

George,John,Thomas,James,Adrew,Martin
Adrew,George,James,John,Martin,Thomas

亲自试一试
例子 2

在本例中,我们将创建一个数组,并按字母顺序进行排序:

<script type="text/javascript">

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort())

</script>

输出:

10,5,40,25,1000,1
1,10,1000,25,40,5

请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:

<script type="text/javascript">

function sortNumber(a,b)
{
return a - b
}

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort(sortNumber))

</script>

输出:

10,5,40,25,1000,1
1,5,10,25,40,1000
sort使用案例
    2、简单数组自定义排序
    <script type="text/javascript">
        var arrSimple2=new Array(1,8,7,6);
        arrSimple2.sort(function(a,b){
            return b-a});
        document.writeln(arrSimple2.join());
    </script>
    解释:a,b表示数组中的任意两个元素,若return > 0 b前a后;reutrn < 0 a前b后;a=b时存在浏览器兼容
    简化一下:a-b输出从小到大排序,b-a输出从大到小排序。
简单数组自定义排序

 

 
 

四、其他

1、序列化

  • JSON.stringify(obj)   序列化
  • var a = {a:1,b:2}
    document.write(JSON.stringify(a))
    结果:
    {"a":1,"b":2}
  • JSON.parse(str)        反序列化
  • var str = '{"name":"lala","age":"23"}';
    document.write(JSON.parse(str));
    答案:
    [object, object]

     

2、转义

  • decodeURI( )                   URl中未转义的字符
  • decodeURIComponent( )   URI组件中的未转义字符
  • encodeURI( )                   URI中的转义字符
  • encodeURIComponent( )   转义URI组件中的字符
  • escape( )                         对字符串转义
  • unescape( )                     给转义字符串解码
  • URIError                         由URl的编码和解码方法抛出

3、eval

JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值。

  • eval() 
  • EvalError   执行字符串中的JavaScript代码
  • 定义和用法
    
    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
    语法
    
    eval(string)
    
    参数     描述
    string     必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
    
    例子 1
    
    在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:
    
    <script type="text/javascript">
    
    eval("x=10;y=20;document.write(x*y)")
    
    document.write(eval("2+2"))
    
    var x=10
    document.write(eval(x+17))
    
    </script>
    
    输出:
    
    200
    4
    27
    详解及案例

4、正则表达式

JavaScript中支持正则表达式,其主要提供了两个功能:

  • test(string)     用于检测正则是否匹配
  • exec(string)    用于获取正则匹配的内容

更多操作参见:http://kb.cnblogs.com/page/80965/

注:定义正则表达式时,“g”、“i”、“m”分别表示全局匹配,忽略大小写、多行匹配。

5、时间处理

JavaScript中提供了时间相关的操作,时间操作中分为两种时间:

  • 时间统一时间
  • 本地时间(东8区)

更多操作参见:http://www.shouce.ren/api/javascript/main.html

五、语句和异常

1、条件语句

JavaScript中支持两个中条件语句,分别是:if 和 switch

    if(条件){
 
    }else if(条件){
         
    }else{
 
    }
if语句
    switch(name){
        case '1':
            age = 123;
            break;
        case '2':
            age = 456;
            break;
        default :
            age = 777;
    }
switch语句

2、循环语句

JavaScript中支持三种循环语句,分别是:

var names = ["alex", "tony", "rain"];

for(var i=0;i<names.length;i++) {
    console.log(i);
    console.log(names[i]);
}
方式一:
var names = ["alex", "tony", "rain"];

for (var index in names) {
      console.log(index);
       console.log(names[index]);
}
方式二:
while(条件){
    // break;
    // continue;
}
方式三

注:字典不支持i++方式

3、异常处理

try {
    //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
  //catch 意思是捕获
// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。 //e是一个局部变量,用来指向Error对象或者其他抛出的对象 } finally { //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。 }

注:主动跑出异常 throw Error('xxxx')---类似于python的raise

六、函数

1、基本函数

JavaScript中函数基本上可以分为一下三类:

//普通函数
    function func(arg) {
          return true;
}    

//匿名函数

    var func = function(arg){
        return "tony";
}   
匿名就是
function test(_param,_callback){
    处理....
    _callback(处理完的参数)
}
test(123,function(a){alert(a)})
//自执行函数
    (function(arg){
        console.log(arg);
})    

注意:对于JavaScript中函数参数,实际参数的个数可能小于形式参数的个数,函数内的特殊值arguments中封装了所有实际参数。

2、作用域

JavaScript中每个函数都有自己的作用域,当出现函数嵌套时,就出现了作用域链。当内层函数使用变量时,会根据作用域链从内到外一层层的循环,如果不存在,则异常。

//            name = "alex";
//            function f1() {
//                var name = "eric";
//                function f2() {
//                    alert(name)
//                };
//                f2();
//            };
//            
//            f1();
View Cod
name = "alex";
function f1() {
    var name = "eric";
    function f2() {
        alert(name);
    }
    return f2
}
var ret = f1();
ret();
        function f2(){
            var arg= [11,22];
            function f3(){
                console.log(arg);
            }
            arg = [44,55];
            return f3;
        }

        ret = f2();
        ret();
演示

注:声明提前,在JavaScript引擎“预编译”时进行。

五句话搞定JavaScript作用域:http://www.cnblogs.com/wupeiqi/p/5649402.html

3、闭包

「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」

由于作用域链只能从内向外找,默认外部无法获取函数内部变量。闭包,在外部获取函数内部的变量。

function f2(){
    var arg= [11,22];
    function f3(){
        a = 123return a;
    }
    return f3;
}
 
ret = f2();
ret();
已这个例子为例,f2就是一个闭包,那么我在执行调用的时候只能通过f2去调用,也就是由外向内去获取调用;而不能由内向外

4、面向对象

function Foo (name,age) {
    this.Name = name;
    this.Age = age;
    this.Func = function(arg){  //相当于创建python的方法,但是这样每个对象都有,相对每个对象都会占有一份地址
        return this.Name + arg;
    }
}

对于上述代码需要注意:

  • Foo充当的构造函数  ---class className()
  • this代指对象     -----self.Name = name
  • 创建对象时需要使用 new   

上述代码中每个对象中均保存了一个相同的Func函数,从而浪费内存。使用原型和可以解决该问题:

function Foo (name, age) {
    this.Name = name;
    this.Age = age;
}
Foo.prototype = {
    GetInfo: function(){
        return this.Name + this.Age;
    },
    Func : function(arg) {
        return this.Name + arg;
    }
}
Foo.prototype.Func = function () {return this.Name + this.Age};//第二种方法
         obj1
= new Foo('damon', 18) ret = obj1.Func();

 

转载于:https://www.cnblogs.com/renfanzi/p/5649543.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值