NodeJs 相当新(但不是 Javascript),我认为它很棒,不是在所有方面,但这不是问题的主题。
偶然发现了这个“功能”,实际上这正是我想要的,但不知道它是合法的还是错误的。我在包含文件中做了什么:
// var <- var is now a comment
ksNone = 0,
ksAltKey = 1,
ksCtrlKey = 2,
ksShiftKey = 4;
......
.......
遍历主文件中的全局对象时,代码如下...
代码:
require( './lib/mycode.js' );
for( var p in global )
{ console.log( p ); }
....你最终会看到:
输出:
........ <- many other vars
........
........
ksNone
ksAltKey
ksCtrlKey
ksShiftKey
让我想到,包含一个具有一堆通用功能的文件并不容易。例如,我有一些函数来验证字符串和数字以及不需要在命名空间或类中的所有其他类型的东西。通常,要包含此类功能,您必须为其指定导出或通过 fs 和 eval() 以一种骇人听闻的方式包含它 - 另请参阅此问题。
我尝试了以下方法:
代码:
ksNone = 0,
ksAltKey = 1,
ksCtrlKey = 2,
ksShiftKey = 4,
isNumber = function( i )
{
return typeof i === 'number' && isFinite(i) && !isNaN(i);
},
isValidNumber = function( i, iMin, iMax )
{
if( !isNumber( i ) )
{ return false; }
if( isNumber( iMin ) && i < iMin )
{ return false; }
if( isNumber( iMax ) && i > iMax )
{ return false; }
return true;
},
isString = function( a )
{
return ( typeof a === 'string' || ( a instanceof String ));
},
isValidString = function( s, iMinLen, iMaxLen )
{
if( isString( s ) )
{
var iLen = s.length,
bIsMin = ( isNumber( iMinLen ) && iMinLen >= 0 )?(iLen >= iMinLen):(iLen > 0),
bIsMax = ( isNumber( iMaxLen ) && iMaxLen >= 0 )?(iLen <= iMaxLen):(iLen > 0);
return ( bIsMin && bIsMax );
}
return false;
};
现在再次遍历将输出:
输出:
........ <- many other vars
........
........
ksNone
ksAltKey
ksCtrlKey
ksShiftKey
isNumber
isValidNumber
isString
isValidString
一旦包含,因为它现在在全局范围内,我可以在任何地方这样做:
代码:
var test = "yes"
if( isValidString( test ) ) // call the global function
{ console.log( "String is valid" ); }
输出:
String is valid
问题:
通常,省略诸如var
(它在严格模式下不起作用 - "use strict";
)之类的声明内容不是一个好主意,但是在这种情况下,它似乎非常方便,因为您不需要指定导出或使用 hacky 方式包含它,这些函数无需命名空间或 const/var 要求声明即可全局访问。
包含文件时实际发生了什么?扫描 NodeJs 的核心 consts、vars、函数以保持私有?它是合法使用还是一个错误?做还是不做,你怎么看?