JavaScript进阶
函数
1,普通函数
function(args){
}
2,匿名函数(顾名思义没有名字的函数)
setInterval("function()", 5000)
匿名函数:
setInterval(function(){
console.log('123');
}, 5000)
3,自执行函数(创建函数并自动执行)
一般的函数需要定义,然后执行。
function func(){
} #
//func()
自执行函数:
(function(args){
console.log(args)
})(1)
注意:自执行函数背景,之所以会有自执行函数,是因为当有大量第三方的插件时,会存在重名的函数从而造成冲突,而自执行函数则不管是否重名,都进行执行。
序列化
JSON.stringify() 将对象转换为字符串
JSON.parse() 将字符串转换为对象
转义
decodeURI( ) URl中未转义的字符 decodeURIComponent( ) URI组件中的未转义字符 encodeURI( ) URI中的转义字符 encodeURIComponent( ) 转义URI组件中的字符 escape( ) 对字符串转义 unescape( ) 给转义字符串解码 URIError 由URl的编码和解码方法抛出 客户端(cookie) => 服务端 将数据经过转义后,保存在cookie
eval
python: val = eval(表达式) # 执行不了逻辑代码(比如lambda表示式,for循环等无法执行),执行表达式有返回值, exec(执行代码) # 可以执行复杂的逻辑代码,但是没有返回值。 JavaScript: eval(表达式或者代码) 是python中两种功能的合集
时间
Date类 var d = new Date() d.getxxxx 获取 d.setxxxx 设置
JavaScript作用域(必知必会)
1, *********************以函数作为作用域*****************
其他语言:以代码块作为作用域(Java C#)
public void Func(){
if 1==1{
string name = 'java'
}
console.writeline(name);
}
Func()
//报错,'name'没有定义。其他语言为块级作用域
python:
情况一:
def Func():
name='tom'
print(name)
Func()
//正常执行,python没有块级作用域。
情况二:
def Func():
name='tom'
print(name)
Func()
print(name)
//报错,'name'没有定义。
总结:其他语言是以块作为作用域,python和JavaScript是以函数作为作用域的。
JavaScript:以函数作为作用域
function Func(){
if(1==1){
var name = 'java';
}
console.log(name);
}
Func()
//成功
2, **********************函数的作用域在函数未被调用之前就已经创建********************
function Func(){
if(1==1){
var name = 'java';
}
console.log(name);
}
3,**********************函数的作用域存在作用域链,并且也是在被调用之前创建**********
xo = 'alex'
function func(){
xo = 'eric';
function inner(){
xo = 'tony';
console.log(xo);
}
inner()
}
func()
//输出: 'tony',遵循上述规则
xo = 'alex'
function func(){
xo = 'eric';
function inner(){
console.log(xo);
}
return inner;
}
ret = func()
ret()
//输出为:'eric'
其实上述函数就相当于执行inner(),函数内部要打印xo,作用域链一次为: xo='alex'--->xo='eric',
由内向外去找,所以结果显然为'eric'
xo = 'alex'
function func(){
xo = 'eric';
function inner(){
console.log(xo);
}
xo = 'tony';
return inner;
}
ret = func()
ret()
//输出为:'tony'
分析:
作用域链:
1,首先执行最上面全局变量 xo='alex'
2,接着,函数func(不执行)加载内存,
3,开始执行ret=func()这一行,执行xo='eric',inner(不执行)加载内存,再向下走,xo='tony',此时的xo将取代上面的xo='eric',
然后返回inner函数
4, 接着向下走执行,ret=func(),此时的ret为innner, ret(),表示要执行inner(),所以结果为'tony'
4,***************************函数内局部变量: 声明提前*******************************
function func(){
console.log(xo);
}
func)();
// 程序直接报错
function func(){
console.log(xo);
var xo = 'alex';
}
func)();
// 输出为:undefined
解释器在解释的过程中会找到所有的局部变量,执行var xo,相当于声明一个变量。
所以当xo一直没有被赋值,所有会输出undefined。
注意:这和上面的小例子之所以结果不同,注意执行流程。注意理解!!!
JavaScript面向对象
前奏:
function foo(){
var xo = 'alex';
}
foo()
function Foo(n){
this.name = n; #this就相当于python中的self,对象中封装的值为name
}
var obj = new Foo('we'); # 创建对象,创建对象前必须加new才表示创建对象,为固定用法。
obj.name
JavaScript面向对象:
function Foo(n){
this.name = n;
this.sayName = function(){
console.log(this.name)
}
}
var obj1 = new Foo('we');
obj1.name
obj1.sayName()
var obj2 = new Foo('wwe');
obj2.name
obj2.sayName()
注意事项:
1,this代指对象(python self)
2,创建对象时用关键字: new 函数()
由上可知:对象obj1,obj2都封装了方法sayName,造成了资源的浪费,下面来看看python中如何处理?
python面向对象:
class Foo:
def __init__(self, name):
self.name = name
def sayName(self):
print(self.name)
obj1 = Foo('we')
obj2 = Foo('wwe')
obj1,obj2分别只分装了name='we',name='wwe'。而方法sayName则保存在类中
下面开始对JavaScript进行改造:
原型:
function Foo(n){
this.name = n;
}
# Foo的原型
Foo.prototype = {
'sayName': function(){
console.log(this.name);
}
}
obj1 = new Foo('we')
obj1.sayName()
注意:prototype为固定用法
执行流程:
obj1 = new Foo('we')即首先通过类创建对象,name封装到对象中,第二步当执行obj1.sayName时,则会去类中的
原型中去找,而不是去类中去找,因此减少了资源的浪费。注意:原型是放在类中的,这和python很类似。
拥抱不确定,未来可期!喜欢该文章请不吝点赞推荐,如有疑问欢迎留言,我们一起探讨。

浙公网安备 33010602011771号