zoukankan      html  css  js  c++  java
  • Javascript中的Void

    void

    一段代码

    <a href="javascript:void(0);">here</a>
    

    Javascript中 void 是一个操作符,该操作符指定要计算一个表达式但是不返回值。

    Javascript伪协议

    真协议用来在因特网上的计算机之间传输数据包, 如HTTP协议, FTP协议等协议, 伪协议则是一种非标准化的协议, Javascript 伪协议让我们通过一个连接来执行Javascript代码

    void 操作符用法

    • javascript:void (expression)
    • javascript:void expression
      expression 是一个要计算的 Javascript 标准的表达式。表达式外侧的圆括号是选的,但是写上去是一个好习惯。

    你可以使用 void 操作符指定超级链接。表达式会被计算但是不会当前文档处装入任何内容。上面的代码创建了一个超级链接,当用户以后不会发生任何事。当用户链接时,Javascript 上没有任何效果。

    在ECMAScript 262规范中的描述

    The void Operator
    
    The production UnaryExpression : void UnaryExpression is evaluated as follows:
    
    Let expr be the result of evaluating UnaryExpression.
    Call GetValue(expr).
    Return undefined.
    NOTE: GetValue must be called even though its value is not used because it may have observable side-effects.
    

    从规范中可以了解到无论void后的表达式是什么,void操作符都会返回undefined

    为什么要用 void

    undefinedJavascript 中并不是保留字和关键字

    function isUndefined(param) {
    	let undefined = 'hello world';
    	return undefined === param;
    }
    

    我们可以在一个函数的上下文中定义一个变量叫 undefined, 这个时候如果要访问真正的 undefined 只能通过全局作用域来取 undefined

    window.undefined;
    GLOBAL.undefined;
    

    遗憾的是 windowGLOBAL 依然可以在函数上下文中定义, 所以从他们身上取 undefined 也不是安全可靠的方法

    function test() {
    	let 
    		undefined = 'hello world',
    		window = { undefined: 'joke' },
    		f = {}
    	;
    
    	console.log(undefined);
    	console.log(window.undefined);
    	console.log(f.a === undefined);
    	console.log(f.a === void 0);
    }
    

    判断 undefined

    function isUndefined(param) {
    	return param === void 0;
    }
    

    另外一种方式

    function getUndefined() {
    	return;
    };
    
    function isUndefined(param) {
    	return param === getUndefined();
    }
    

    这种方式可行是因为一个函数不指定返回值将默认返回 undefined, 缺点是为了判断 undefined 还要声明一个函数, 性能上有所损耗。

    优先级

    void 优先级仅次于. [] ()

    最后

    GetValue一定要调用,即使它的值不会被用到,但是这个表达式可能会有副作用(side-effects)。

    const demo = function() {
    	let someVar = 10;
    	return {
    	    get getSomeVar() {
    	        someVar--;
    	        return '已执行getSomeVar';
    	    },
    	    get someVar() {
    	        return someVar;
    	    }
    	};
    }();
    
    console.log(demo.getSomeVar);
    console.log(demo.someVar);
    void demo.getSomeVar;
    console.log(demo.someVar);
    delete demo.getSomeVar;
    console.log(demo.someVar);
    

    小结

    • 通过采用 void 0undefined 比采用字面上的 undefined 更安全,应该优先采用 void 0 这种方式。
    • 填充<a>的href确保点击时不会产生页面跳转, 避免为a标签添加点击事件使用 return false 组织默认行为。
  • 相关阅读:
    flex>数据绑定、数据列表 小强斋
    上周问题总结与解决方案
    asp.net 实现无限级分类
    发个项目需求大家瞅瞅
    ASP.NET POST模拟登陆
    HttpWebRequest发送数据 post
    asp.net 生成静态页面
    xcode4.1自带SVN配置
    模拟登录
    C#中用HttpWebRequest/HttpWebResponse来发送/接收数据
  • 原文地址:https://www.cnblogs.com/idiv/p/8249964.html
Copyright © 2011-2022 走看看