JavaScript基础知识点整理 转义 作用域

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » 经验教程 » JavaScript基础知识点整理 转义 作用域

JavaScript中URL转义

相当于Python中的encode编码和decode解码操作,主要就是对存在中文的URL进行转义,具体可到浏览器的控制台练习。

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

JavaScript中的eval

在Python中存在内建的方法eval(表达式)exec(执行代码),两者都可以执行字符串表达式。eval(“1+1”)可以直接计算结果并返回,但是不能执行for循环,使用exec就可以,该方法没有返回值。JavaScript中的eval是Python中eval和exec的结合体,可以执行代码,也可以执行表达式,并且有返回值。

    eval() 
    EvalError   执行字符串中的JavaScript代码

JavaScript中的时间处理

JavaScript中提供了时间相关的操作,时间操作中分为两种时间: 时间统一时间;本地时间(东8区)。在Python使用time模块获取时间,在js中需要有一个Date对象,有了它我们才可以通过它操作时间:

var d=new Date()  //创建时间对象 d封装了当前时间
//想要获取详细的时间信息 哪一年 分钟等等
d.getMinutes()  //可以使用d.来获取

n=d.getMinutes() +5 //修改当前时间
d.setMinutes(n)  //设置当前时间

JavaScript的作用域

类比于其它语言,都是以代码块作为作用域的,如果超出了代码块就会报错。例如说下面的Python代码:

def func():
    if 2==2:
        name='鳄鱼君Ba'
    print(name)
func()
#print(name) #这样运行就会报错

我们来看一下java的代码:

public void Func(){
    if(2==2){
        string name='Java';
    }
    console.writeline(name);
}
Func()

两者相比较,在其它语言中是以大括号作为代码块的,在Python中是以冒号加上缩进作为代码块。在Python中如果在函数执行结束在打印name就会报错,那么就可以理解为在Python中是以函数作为作用域的,一个函数整体是一个作用域,在外部运行内部的变量就会报错。

在JavaScript中默认是通过函数来划分作用域的,例如:

function func(){
    if(2==2){
       var name='鳄鱼君Ba';
    }
    console.log(name);
}
func()

1.函数的作用域在创建函数且未执行时候就已经存在。
2.函数的作用域存在作用域链,并且也是在被调用之前创建。
3.js代码内部,局部变量会提前声明,但是不会赋值。

当出现函数嵌套时,就出现了作用域链(一个函数里面嵌套函数)。当内层函数使用变量时,会根据作用域链从内到外一层层的循环,如果不存在,则异常。

ppxia="鳄鱼君Ba";  //定义一个全局变量
function func1(){
    var ppxia="Python";
    function func2(){
        var ppxia="Java";
        console.log(ppxia);
    }
    func2()
}
func1()

以上存在函数的嵌套,就会出现作用域链,最外层是func1的作用域,在内部有func2作用域,如果内部执行func2,就会寻找ppxia变量并打印,优先从内部也就是自己的作用域寻找,如果没有上一级找,也就是func1的作用域,如果没有到全局变量中寻找,没有全局变量就找不到报错了。你可以自己去掉ppxia变量试试。我们呢再来看另一种情况:

ppxia="鳄鱼君Ba";  //定义一个全局变量
function func1(){
    var ppxia="Python";
    function func2(){
        console.log(ppxia);
    }
    return func2;
}
var ret=func1();  
ret()

函数加括号表示会执行func1,但是func2内部没有执行,而是返回了func2函数,所以ret接收的就是func1的返回值代指func2,再执行ret(),所以最终会输出Python。我们在来看下一个例子:

ppxia="鳄鱼君Ba";  //定义一个全局变量
function func1(){
    var ppxia="Python";
    function func2(){
        console.log(ppxia);
    }
    var ppxia="Java";
    return func2;
}
var ret=func1();  
ret()

解析器会按照从上到下的顺序执行代码,ppxia在执行func1函数的时候,ppxia会被修改为Java,再次执行ret的时候就相当于执行func2函数,它会寻找ppxia的值,自己没有往上一级寻找,也就是Java。我们再看一个例子:

function func1(){
   console.log(ppxia);
   var ppxia="鳄鱼君Ba";
    }

以上代码执行会输出undefined,你可能觉得会输出鳄鱼君Ba,那么在你眼里js代码会跳着执行。不多解释:函数内部局部变量提前声明

JavaScript面向对象

function Func2(name){
	this.Name=name;
}
//this相当于Python中的self

var obj =new Func2('鳄鱼君Ba') ; //创建一个对象 对象里面封装了一个name值等于鳄鱼君Ba
obj.Name

this指代对象(相当于Python的self);
创建对象:new 函数()

function Func2(name){
	this.Name=name;
	this.sayName=function(){
		console.log(this.Name);
	}
}
//创建两个对象
var obj1=new Func2('鳄鱼君Ba');
obj1.Name  //
obj1.sayName()   //调用方法

var obj2=new Func2('Python');
obj2.Name  //
obj2.sayName()   //调用方法

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

function Func2(name){
	this.Name=name;
        //Func2的原型
        Foo.prototype={
            'sayName':function(){
		console.log(this.Name);
	}
}
var obj1=new Func2('鳄鱼君Ba1');   //每一个对象中只封装以一个Name
obj1.sayName()   //调用方法
var obj2=new Func2('鳄鱼君Ba2');

解释器从上到下开始执行,先创建一个类

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《JavaScript基础知识点整理 转义 作用域》 发布于2020-05-01

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

3 + 1 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册